OK-Librariesの一般的な使用方法の利点を得るために、GSonからMOSHIにコードを移行したいまた、OKHTTPとRetrofitで。 Gsonと簡単ですMoshi 1.2.0でHashMapsのリストを変換するとエラーが発生する
しかし、タスクはMOSHIを合併しているようだ:
私はオブジェクトのリストを含むクラスを持っています。
これらのオブジェクトは、フィールド名と値のペアで構成されています。これをHashMapとして実装しました。このクラスにはいくつかのコンストラクターとメソッドがありますが、JSONではフィールドと値のペアのみが関連しています。私はMOSHIとバックでJSONに、これらのクラスを変換しようとすると、子供たちが空である
{"children":[{"f1":"v11","f2":"v12"},{"f1":"v21","f2":"v22"}]}
:最低限まで剥奪
、私のJSONは次のようになります。 JSONへ
変換が
{"children":[{},{}]}
を与え、上からのClass2にJSON文字列のデシリアライゼーションは、2人の子供を与えるが、子どもたちはempptyあります。
実際のコードでは、その親オブジェクトには他のクラスのオブジェクトのリストも含まれています。これらのクラスは期待どおりに動作します。ここの問題は、私の子クラスがHashMapから拡張されているようです。
Gsonはすべて正常に動作します。
ここではユニットテストですが、動作をテストするために書いてあります。
public class Test_Moshi {
private final Moshi moshi = new Moshi.Builder().build();
private static class Class1 extends HashMap<String, Object> {
//Some Constructors and methods omitted for the test.
//Relevant for the serilisation to JSON are only the keys and values in the map.
}
private static class Class2 {
List<Class1> children = new ArrayList<>();
}
@Test public void test1() {
Class1 child;
Class2 parent = new Class2();
child = new Class1();
child.put("f1", "v11");
child.put("f2", "v12");
parent.children.add(child);
child = new Class1();
child.put("f1", "v21");
child.put("f2", "v22");
parent.children.add(child);
String json_gson = new Gson().toJson(parent);
String json_moshi = moshi.adapter(Class2.class).toJson(parent);
assertEquals(json_gson, json_moshi);
}
@Test public void test2() throws IOException {
String json = "{\"children\":[{\"f1\":\"v11\",\"f2\":\"v12\"},{\"f1\":\"v21\",\"f2\":\"v22\"}]}";
Class2 class2 = moshi.adapter(Class2.class).fromJson(json);
assertEquals(2, class2.children.size());
assertEquals("Child 1 contains expected number of fields", 2, class2.children.get(0).size());
assertEquals("Child 2 contains expected number of fields", 2, class2.children.get(1).size());
}
}