Моши разбирает с InputStream - PullRequest
       11

Моши разбирает с InputStream

0 голосов
/ 14 февраля 2020

Предполагая, что мне нужно проанализировать огромный список Item s из json файла активов в Android в формате, подобном приведенному ниже:

[
    {
        "id": 1,
        "name: "Tom"
        // other stuff to describe "Item"
    }
]

По соображениям производительности я хочу избежать преобразование всего файла в один String и анализ его с помощью moshi. Вместо этого я хочу использовать stream и анализировать каждый элемент с 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 ...

}

Я долго искал, но не смог найти эквивалентный способ Моши для этого. Любой совет?

Спасибо

1 Ответ

0 голосов
/ 10 апреля 2020

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