【问题标题】:Deserialize json with list of nested objects使用嵌套对象列表反序列化 json
【发布时间】:2019-06-02 19:37:33
【问题描述】:

我想使用 jackson-databind 将 json 反序列化为一个包含其他对象列表的对象。

我正在尝试反序列化以下 json。我有 Class1,它有一个 List<NestedProp>。 Prop2 是一个数组列表。 List<NestedProp> prop2.

类结构 `

class Class1 {
  String prop1;
  List<NestedProp> prop2;
  //setters getters
}

class NestedProp {
  String p1;
  String p2;
  //setters getters
}
`

```
  "class1": {
    "prop1": "pp",
    "prop2": [
      {
        "nestedProp": [
          {
            "p1": "127",
            "p2": "1"
          },
          {
            "p1": "128",
            "p2": "2"
          }
        ]
      }
    ]
  }

While deserialisingI get the below exception:

>com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `NestedProp` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('127')
 at [Source: (File); line: 59, column: 7] (through reference chain: java.util.ArrayList[1]->Class1["prop2"]->java.util.ArrayList[0])


    List<Class1> testData = objectMapper.readValue(test.json, Class1.class);

【问题讨论】:

  • 请编辑问题并向我们展示课程。 --- 提示: 由于{} 大括号有 3 个级别,因此您需要 3 个类(除非您使用 Map,但这似乎不太可能)。假设Class1 有字段prop1prop2,而NestedProp 有字段p1p2,那么什么类有字段nestedProp
  • 显示Class1代码
  • @Deapool 我已经添加了类结构。只有2个级别。 prop1 是字符串。

标签: java jackson jackson-databind


【解决方案1】:

JSON 有效负载中有两个数组。因此,您需要为其创建额外的POJO。见下例:

import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.File;
import java.util.List;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        ObjectMapper mapper = new ObjectMapper();
        Root root = mapper.readValue(jsonFile, Root.class);
        System.out.println(root);
    }
}

class Root {

    private Class1 class1;

    //getters, setters, toString
}

class Class1 {

    private String prop1;
    private List<NestedProps> prop2;

    //getters, setters, toString
}

class NestedProps {

    private List<NestedProp> nestedProp;

    //getters, setters, toString
}

class NestedProp {
    private String p1;
    private String p2;

    //getters, setters, toString
}

以下JSON:

{
  "class1": {
    "prop1": "pp",
    "prop2": [
      {
        "nestedProp": [
          {
            "p1": "127",
            "p2": "1"
          },
          {
            "p1": "128",
            "p2": "2"
          }
        ]
      }
    ]
  }
}

以上示例打印:

Root{class1=Class1{prop1='pp', prop2=[NestedProps{nestedProp=[NestedProp{p1='127', p2='1'}, NestedProp{p1='128', p2='2'}]}]}}

另见:

【讨论】:

  • Ziober 我的实际 json 包含一个 class1 数组。
  • @Shrikant,所以在这种情况下你需要使用List&lt;Class1&gt; 类型。
  • Ziober 但是在 Class1 中有 List 并且 Jackson 无法识别该 NestedProps 类
  • @Shrikant,您需要发布您拥有的整个 JSON 有效负载。我的示例展示了如何处理嵌套数组。如果您有一个数组,则需要使用List,如果是对象,则需要使用POJOMap,如果是JSON 原语-Java 原语。请查看链接的问题和建议的解决方案。有一个工具可以根据给定的JSON 创建POJO 模型。
  • @Shrikant,我很高兴听到这个消息。如果我的回答有帮助,请查看How does accepting an answer work?
猜你喜欢
  • 1970-01-01
  • 2019-03-08
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
  • 2016-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多