OKHTTP と Retrofit でもこれを使用しているため、OK-Libraries の一般的な基本的な使用法の利点を得るために、GSon から MOSHI にコードを移行したいと考えています。
しかし、Gson では単純なタスクが、MOSHI では複雑に見えます。
オブジェクトのリストを含むクラスがあります。
そして、これらのオブジェクトはフィールド名と値のペアで構成されています - 私はそれを HashMap として実装しました。このクラスにはさらにいくつかのコンストラクターとメソッドがありますが、JSON の場合はフィールドと値のペアのみが関連します。
私の JSON は次のようになります。
{"children":[{"f1":"v11","f2":"v12"},{"f1":"v21","f2":"v22"}]}
これらのクラスを MOSHI で JSON に変換して戻すと、子が空になります。
JSONへの変換は
{"children":[{},{}]}
上記から Class2 への json-string の逆シリアル化により、2 つの子が生成されますが、子は空です。
私の実際のコードでは、その親オブジェクトには他のクラスのオブジェクトのリストも含まれています-これらのクラスは期待どおりに機能します。ここでの問題は、私の子クラスが 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());
}
}