android - 使用 InputStream 进行 Moshi 解析

标签 android json parsing inputstream moshi

假设我需要解析 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/

相关文章:

java - Android、XML View 文件和 Java 后端,我如何使用后端 Java 创建自定义 View ?

javascript - 为什么 webpack watch 不工作?

json - 将查询参数添加到 Go Json Rest

xml - 戈朗 : Undefined field in struct error

c++ - 使用 Boost::Spirit 解析具有未知键的 'key = value' 列表

android - swprintf() 不适用于 Android Kitkat 及以下版本?

java.lang.NullPointerException 第 53 行

javascript - Android KeyUp、KeyDown 和 KeyPress 事件不适用于 Angular2

javascript - 使用子字符串从 JSON 对象检索数据

java - 用Gson解析Json以及列表的问题