【问题标题】:Moshi parsing with InputStream使用 InputStream 进行 Moshi 解析
【发布时间】:2020-05-30 07:18:07
【问题描述】:

假设我需要从 Android 中的一个 json 资产文件中解析大量的Items 列表,格式类似于以下:

[
    {
        "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 的等效方法。有什么建议吗?

谢谢

【问题讨论】:

    标签: android json parsing inputstream moshi


    【解决方案1】:

    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()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-24
      • 2015-09-03
      • 1970-01-01
      • 1970-01-01
      • 2021-04-24
      • 2019-04-24
      • 2018-12-25
      • 1970-01-01
      相关资源
      最近更新 更多