【问题标题】:How to create appropriate POJOs to provided JSON response?如何创建适当的 POJO 来提供 JSON 响应?
【发布时间】:2020-06-12 20:11:46
【问题描述】:

社区! 我从一些 API 得到以下 JSON 响应:

[
    [
        [
            {
                "key": [
                    "1",
                    "test1"
                ],
                "value": 1582890257944
            },
            {
                "key": [
                    "2",
                    "test2"
                ],
                "value": 1582888081654
            },
            {
                "key": [
                    "3",
                    "test3"
                ],
                "value": 1582884771691
            }
        ]
    ]
]

我应该创建类来将此 JSON 映射到 Java 类 以前我得到以下 JSON:

[
    {
        "key": [
            "test1"
        ],
        "value": 1
    },
    {
        "key": [
            "test2"
        ],
        "value": 2
    }
]

对于这个 JSON,我创建了一个简单的类:

public class SomeClass {

    private List<String> key;
    private int value;
}

Jackson 正确地映射了它,没有任何问题...

请帮助我,我需要什么样的课程结构? 我试着写这样的东西:

        List<String> params = new ArrayList<>();
        params.add("1");
        params.add("test1");

        SomeClass someClass = new SomeClass();
        someClass.setKey(params);
        someClass.setValue(1L);

        List<SomeClass> arrays = new ArrayList<>();
        arrays.add(someClass);
        arrays.add(someClass);

        List<List<SomeClass>> arrayLists = new ArrayList<>();
        arrayLists.add(arrays);

        List<List<List<SomeClass>>> threeLists = new ArrayList<>();
        threeLists.add(arrayLists);

        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        String prettyJson = gson.toJson(threeLists);

        System.out.println(prettyJson);

并且得到了与我从响应中得到的相同的 JSON... 我应该使用下一个结构创建类吗?

List<List<List<String>>> key;
long value;

但我从杰克逊那里得到了错误:

线程“main”com.fasterxml.jackson.databind.exc.MismatchedInputException 中的异常:无法从 START_ARRAY 令牌中反序列化 main.entity.SomeClass 的实例 在 [来源:(StringReader);行:2,列:5](通过引用链:java.lang.Object[][0])

【问题讨论】:

    标签: java json jackson mapping objectmapper


    【解决方案1】:

    使用 List&lt;List&lt;List&lt;String&gt;&gt;&gt; key 将不起作用,因为 Json 结构是 List&lt;List&lt;List&lt;SomeClass&gt;&gt;&gt;,正如您在示例代码中所拥有的那样。

    您可以使用 Jackson TypeReference 类进行反序列化。使用 jackson-databind 的示例代码。

    public static void main(String[] args) {
        ObjectMapper mapper = new ObjectMapper();
        String json = "[[[{\"key\":[\"1\",\"test1\"],\"value\":1},{\"key\":[\"1\",\"test1\"],\"value\":1}]]]";
        TypeReference<List<List<List<SomeClass>>>> typeRef = new TypeReference<List<List<List<SomeClass>>>>() {
        };
        try {
            List<List<List<SomeClass>>> someClassList = mapper.readValue(json, typeRef);
            System.out.println(someClassList);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    

    【讨论】:

    • 谢谢,这个解决方案工作正常,但需要添加@JsonIgnoreProperties(ignoreUnknown = true)。我认为仅在我的情况下..
    猜你喜欢
    • 2019-09-06
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 2019-08-01
    • 1970-01-01
    相关资源
    最近更新 更多