Android应用用Proteus加载JSON动态视图时遇空指针异常求助
解决Proteus框架JSON生成动态视图时的空指针异常问题
你遇到的空指针异常根源很明确——你并没有真正读取到assets文件夹里的JSON文件内容,而是把文件名字符串直接当成了JSON数据来解析,导致layout对象为null,后续访问它的type字段时触发了异常。
问题出在哪里?
你的代码里用了new StringReader("layouts.json"),这会创建一个读取字符串"layouts.json"的Reader,而不是读取assets目录下名为layouts.json的文件内容。这个字符串本身不是有效的JSON,所以解析出来的layout自然是null,进而抛出Attempt to read from field 'java.lang.String com.flipkart.android.proteus.value.Layout.type' on a null object reference错误。
修正步骤
你需要通过AssetManager正确读取assets文件夹中的JSON文件内容,再传入StringReader进行解析。
1. 添加读取assets文件的工具方法
先写一个通用方法来读取assets里的文件内容:
private String readAssetFile(AssetManager assetManager, String fileName) throws IOException { InputStream inputStream = assetManager.open(fileName); int size = inputStream.available(); byte[] buffer = new byte[size]; inputStream.read(buffer); inputStream.close(); return new String(buffer, StandardCharsets.UTF_8); }
2. 修改原有的JSON读取逻辑
替换你原来的代码,先读取文件内容再创建JsonReader:
AssetManager assetManager = getAssets(); // 在Activity/Fragment中获取,若在其他类需传入上下文获取 try { // 读取布局JSON文件内容 String layoutJsonContent = readAssetFile(assetManager, "layouts.json"); JsonReader readerlayout = new JsonReader(new StringReader(layoutJsonContent)); readerlayout.setLenient(true); // 读取数据JSON文件内容 String dataJsonContent = readAssetFile(assetManager, "user.json"); JsonReader readerdata = new JsonReader(new StringReader(dataJsonContent)); readerdata.setLenient(true); layout = proteusTypeAdapterFactory.LAYOUT_TYPE_ADAPTER.read(readerlayout); data = proteusTypeAdapterFactory.OBJECT_TYPE_ADAPTER.read(readerdata); } catch (IOException e) { throw new RuntimeException(e); } // 后续的视图渲染逻辑 view = layoutInflater.inflate(layout, data, container, 0); container.addView(view.getAsView());
额外检查点
- 确认assets文件夹中的文件名拼写完全正确(Android系统对文件名大小写敏感,比如
Layouts.json和layouts.json是两个不同的文件) - 验证JSON文件格式是否有效,避免因JSON语法错误导致解析失败
- 确认
proteusTypeAdapterFactory已经正确初始化,没有为null
内容的提问来源于stack exchange,提问作者Prajakta Chavan
相关产品推荐
相关产品推荐

