Moshi - 解析未知的JSON键

10
我该如何使用Moshi解析一个具有编译时未知键的JSON结构?
"foo": {
  "name": "hello",
  "bar": {
    "unknownKey1": {
      "a": "1"
      }
    },
    "unknownKey2": {
      "b": "2"
    },
    "unknownKeyX": {
      "c": "X"
    }
  },
  "properties": {...}
}

我尝试使用@FromJson适配器来处理JSONObject,但是日志显示JSON为空{}(我期望的是{"unknownKey1": { ... etc ...})。
   class Foo {

        @Json(name = "name")
        String name;
        @Json(name = "bar")
        Bar bar;

        static class Bar {

        }
    }

class BarAdapter {

    @FromJson
    Bar fromJson(JSONObject json) {
        Log.d("xxx", "got " + json.toString());
        return new Bar();
    }
}

一旦我可以获取bar内部的json,我就可以手动迭代它并将其添加到列表或其他地方(因为我不知道会有多少项)。

像这样使用:

         Moshi moshi = new Moshi.Builder()
        .add(new BarAdapter())
        .add(new LinkedHashMapConverter())
        .build();

我还需要添加LinkedHashMapConverter才能满足moshi的要求,但是在它上面加日志后,发现它的方法从未被调用过(这可能与我的实际json有关)。你有什么想法吗?
1个回答

10
使用Map。
@FromJson
Bar fromJson(Map<String, Baz> json) {
    Log.d("xxx", "got " + json.toString());
    return new Bar();
}

如果您也不知道地图值的类型,可以使用 Object。

你能否使用 Object? - ataulm
1
对象很特殊。它将根据JSON的内容转换为Map、List、Double、String或Boolean。 - Jesse Wilson
@JesseWilson,这似乎完全无法与Kotlin和Retrofit2一起使用。有什么线索吗?Baz是什么? - toby yeats

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接