假设我需要解析 Item
的巨大列表s 来自 Android 中的 json Assets 文件,格式类似于以下:
[
{
"id": 1,
"name: "Tom"
// other stuff to describe "Item"
}
]
出于性能原因,我想避免将整个文件转换为单个
String
并使用 moshi
解析它.我想改为使用流并将每个项目从 json 解析为 Item
并自己构建项目列表。与 gson
我认为可以这样做:Gson gson = new GsonBuilder().create();
List<Item> items = new ArrayList<>();
// Read file in stream mode
try (JsonReader reader = new JsonReader(in)) {
reader.beginArray();
while (reader.hasNext()) {
// Read data into object model
Item item = gson.fromJson(reader, Item.class);
items.add(item);
}
} catch ...
}
我一直在寻找一段时间,但找不到 Moshi 的等效方法。有什么建议吗?
谢谢
最佳答案
Moshi 使用 Okio,所以你可以对流 json 做这样的事情:
private val moshi by lazy {
Moshi.Builder().build()
}
private val adapter by lazy {
moshi.adapter(Layout::class.java)
}
fun AssetManager.layoutsFromJson(jsonFile: String): List<Layout> {
val layouts = mutableListOf<Layout>()
JsonReader.of(Okio.buffer(Okio.source(open(jsonFile)))).use { reader ->
reader.beginArray()
while (reader.hasNext()) {
adapter.fromJson(reader)?.let {
layouts.add(it)
}
}
}
return layouts
}
fun Fragment.layoutsAsset(jsonFile: String): List<Layout> {
return context?.assets?.layoutsFromJson(jsonFile) ?: emptyList()
}
关于android - 使用 InputStream 进行 Moshi 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60227192/