反序列化包含嵌套对象列表的 JSON

3

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

我正在尝试反序列化下面的json。我有一个名为Class1的类,它包含一个List<NestedProp>,其中Prop2是一个ArrayList。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 - Andreas
展示 Class1 代码。 - Ryuzaki L
@Deapool,我已经添加了类结构。只有两个级别。prop1是字符串。 - Shrikant
1个回答

0

你的 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'}]}]}}

另请参阅:

  • {{link1:JSON对象数组到Java POJO的转换}}

Ziober 我实际的 JSON 包含一个 class1 数组。 - Shrikant
@Shrikant,所以在这种情况下,你需要使用List<Class1>类型。 - Michał Ziober
Ziober但在Class1中,有一个List <NestedProps>和Jackson无法识别NestedProps类。 - Shrikant
@Shrikant,您需要发布您拥有的整个JSON负载。我的示例展示了如何处理嵌套数组。如果您有一个数组,您需要使用List,如果是对象,则需要使用POJOMap,如果是JSON原始值-Java原始值。请查看链接的问题和提出的解决方案。有一个工具可以根据给定的JSON创建POJO模型。 - Michał Ziober
@Shrikant,很高兴听到这个消息。如果我的回答有帮助,请查看接受答案的方式是什么? - Michał Ziober

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