我想将我的代码从 GSon 迁移到 MOSHI,以便获得 OK-Libraries 的常见底层用法的好处,因为我也将它与 OKHTTP 和 Retrofit 一起使用。但是用 Gson 简单的任务用 MOSHI 似乎很复杂:我有一个包含对象列表的类。这些对象由字段名/值对组成 - 我将其作为 HashMap 实现。在这个类中有更多的构造函数和方法,但对于 JSON,只有字段/值对是相关的。精简到最低限度,我的 JSON 应该如下所示:{"children":[{"f1":"v11","f2":"v12"},{"f1":"v21","f2":"v22"}]}当我尝试使用 MOSHI 将这些类转换为 JSON 并返回时, children 是空的。转换为 JSON 给出{"children":[{},{}]}将 json 字符串从上面反序列化到 Class2 会产生 2 个 child ,但 child 是空的。在我的真实代码中,父对象还包含其他类的对象列表 - 这些类按预期工作。这里的问题似乎是我的子类是从 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()); }} 最佳答案 经过一段时间的 sleep 后,我找到了一个解决方案(尽管我认为 Moshi 应该开箱即用地处理这种情况):正如您在答案中所读到的,Moshi 正确处理了 Map 接口(interface)。解决方案是提供自定义类型适配器,将类映射到 Map-Interface 并返回。其余的由 Moshi 处理。我的问题中的代码必须更改如下:创建一个映射到 Map-Interface 的适配器类,如 Moshi 的文档中所述。private static class Class1 extends HashMap<String, Object> { public static class class1ToJsonAdapter { @ToJson public Map<String, Object> toJson(Class1 dat) { return (Map<String,Object>)dat; } @FromJson public Class1 fromJson(Map<String,Object> json) { Class1 result = new Class1(); for (String key : json.keySet()) result.put(key, json.get(key)); return result; } } //Some Constructors and methods omitted for the test. //Relevant for the serilisation to JSON are only the keys and values in the map.}这个适配器必须添加到 moshi-objectprivate final Moshi moshi = new Moshi.Builder() .add(new Class1.class1ToJsonAdapter()) .build();现在,从 JSON 到 JSON 的转换按预期工作。关于java - 使用 Moshi 1.2.0 将 HashMap 列表从/到 JSON 的转换失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39541007/ 10-15 22:13