spring-boot-json反序列化

xa9qqrwz  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(448)

在进行rest调用时,我得到嵌套的json对象和json数组作为响应。嵌套的json数组和json对象随机出现。它可能不是每次都作为响应的一部分出现。我想反序列化json,使json中的所有字段都位于java对象的根级别。
json响应

{
    "data": {
        "id":"42342sdz",
        "details" : {
            "username": "Username",
            "location": "Location",
            "history":[
                { 
                    "historyId":"34312cs", "historyDetail":"Some val", "datetime":"Some val", 
                    "myObj":{
                        "myField" : "Some val"
                    }
                },
                { "historyId":"34312cs", "historyDetail":"Some val", "datetime":"Some val"}
            ]
        }
    }
}

java对象,我想通过解析上面的json响应来构建它。

class ResponseObject {
String id;
String username;
String location;
List<History> historyList;
//Getters and Setters
}

class History {
String historyId;
String historyDetails
String datetime;
String myField;
//Getters and Setters
}
ulydmbyx

ulydmbyx1#

当你说json对象随机出现的时候,我不太清楚你的意思。如果您的意思是字段本身是随机的(带有随机标签),那么我不确定您是否可以将它们作为字段存储在这样的java对象中。但是,如果您事先知道这些字段,那么您可以告诉jackson(springboot使用的json反序列化程序)如何通过向 ResponseObject 类,看起来像这样:

@SuppressWarnings("unchecked")
@JsonProperty("data")
private void unpackNested(Map<String, Object> data) {
    this.id = (String) data.get("id");
    Map<String, Object> details = (Map<String, Object>) data.get("details");
    this.username = (String) details.get("username");
    this.location = (String) details.get("location");
    List<Map<String, Object>> originalHistory = (List<Map<String, Object>>) details.get("history");
    historyList = new ArrayList<>();
    if (originalHistory != null) {
        for (Map<String, Object> h : originalHistory) {
            History history = new History();
            history.setHistoryId((String) h.get("historyId"));
            history.setHistoryDetails((String) h.get("historyDetail"));
            history.setDatetime((String) h.get("datetime"));
            Map<String, Object> myObj = (Map<String, Object>) h.get("myObj");
            if (myObj != null) {
                history.setMyField((String) myObj.get("myField"));
            }
            historyList.add(history);
        }
    }
}

如果你不知道这些字段的名称,那么我认为你能做的就是把它存储到一个单位 Map<String, Object> .

相关问题