繁体   English   中英

使用 Jackson 反序列化复杂的嵌套 Json

[英]Deserialising complex nested Json using Jackson

我正在努力将复杂的嵌套 Json 数据反序列化为 Java 对象我认为我的 class 结构是错误的。 这是我的 Json 数据:

    {
"resultsPerPage": 20,
"startIndex": 0,
"totalResults": 2,
"result": {
    "dataType": "CPE",
    "feedVersion": "1.0",
    "cpeCount": 2,
    "feedTimestamp": "2021-03-19T13:06",
    "cpes": [
        {
            "deprecated": false,
            "cpe23Uri": "cpe:2.3:o:microsoft:windows_10:1511:*:*:*:*:*:x64:*",
            "lastModifiedDate": "2015-12-09T17:28Z",
            "titles": [
                {
                    "title": "Microsoft Windows 10 1511 64-bit",
                    "lang": "en_US"
                }
            ],
            "refs": [
                {
                    "ref": "https://www.microsoft.com/en-us/",
                    "type": "Vendor"
                }
            ],
            "deprecatedBy": [],
            "vulnerabilities": [
                "CVE-2016-0174",
                "CVE-2016-0171"
            ]
        }

这是 class I map Json 数据:

public class RESPONSE {

    Result result;
}

class Result {

    List<Cpes> cpes;
}

class Cpes {

    String cpe23Uri;
    List<Titles> titles;
    List<String> vulnerabilities;
}

class Titles{

    String title;
}

当我在下面的代码中调试我的代码r是 null 时,我认为这是因为我的响应 class 设置不正确。

        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        RESPONSE r = mapper.readValue(response.getContent(), RESPONSE.class);

        System.out.println(r);

您的 object model 应该与您尝试读取的 JSON 的结构相匹配。 例如,它必须如下所示:

public class Response {
    private int resultsPerPage;
    private int startIndex;
    private int totalResults;
    private Result result;
    
    // Should include getters and setters
}

public class Result {
    private String dataType;
    private String feedVersion;
    private int cpeCount;
    private String feedTimestamp;
    private CPE[] cpes;

    // Should include getters and setters
}

public class CPE {
    private boolean deprecated;
    private String cpe23Uri;
    private String lastModifiedDate;
    private Title[] titles;
    private Ref[] refs;
    private String[] deprecatedBy;
    private String[] vulnerabilities;

    // Should include getters and setters
}

public class Title {
    private String title;
    private String lang;

    // Should include getters and setters
}

public class Ref {
    private String ref;
    private String type;

    // Should include getters and setters
}

请注意,为了使代码示例简短,我省略了 getter 和 setter。

编辑:正如 Tugrul 在下面指出的那样,由于禁用了未知属性的失败,因此如果 model 中缺少字段,它不会失败。 唯一的问题是缺少 getter 和 setter。

我还找到了另一种解决此问题的方法以供将来参考。

我使用树数据结构来访问我的 Json 字段,这意味着我可以只声明一个平面 class:

public class Test {

    private String cpe23Uri;
    private String title;
    private List<String> vulnerabilities;


    public String getCpe23Uri() {
        return cpe23Uri;
    }

    public void setCpe23Uri(String cpe23Uri) {
        this.cpe23Uri = cpe23Uri;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public List<String> getVulnerabilities() {
        return vulnerabilities;
    }

    public void setVulnerabilities(List<String> vulnerabilities) {
        this.vulnerabilities = vulnerabilities;
    }
}

然后我使用Tree映射

        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        JsonNode resultNode = mapper.readTree(response.getContent());

        Test t = new Test();

        t.setCpe23Uri(resultNode.get("result").get("cpes").get(0).get("cpe23Uri").textValue());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM