首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套JSONObject反序列化为JSONObject

嵌套JSONObject反序列化为JSONObject
EN

Stack Overflow用户
提问于 2019-03-20 16:07:14
回答 1查看 1.3K关注 0票数 2

因此,我正在进行反序列化嵌套JSONObject的工作,但不希望为每个嵌套对象创建一个类。我试图接受嵌套的JSONObjects,并将其放入JSONObject中。

代码语言:javascript
复制
public class ContainerStatus {

@JsonProperty("name")
private String name;
@JsonProperty("state")
private JSONObject state;
@JsonProperty("lastState")
private JSONObject  lastState;
@JsonProperty("ready")
private Boolean ready;
@JsonProperty("restartCount")
private Integer restartCount;
@JsonProperty("image")
private String image;
@JsonProperty("imageID")
private String imageID;
@JsonProperty("containerID")
private String containerID;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

使用它来反序列化:

代码语言:javascript
复制
 { "containerStatuses": 
        {
            "name": "connect",
            "state": {
                        "terminated": {
                            "exitCode": 1,
                            "reason": "Error",
                            "startedAt": "2019-03-20T15:40:08Z",
                            "finishedAt": "2019-03-20T15:40:50Z",
                            "containerID": "docker://"
                        }
                    },
            "lastState": {},
            "ready": true,
            "restartCount": 0,
            "image": "image",
            "imageID": "docker-pullable://",
            "containerID": "docker://"
        }}

由于状态JSONObject,无法识别的字段“终止”。

我想要一个:

JsonObject state = { "terminated": { "exitCode": 1, "reason": "Error", "startedAt": "2019-03-20T15:40:08Z", "finishedAt": "2019-03-20T15:40:50Z", "containerID": "docker://" } }

我可以将它转换成一个通用对象,但格式不再是JSON:

代码语言:javascript
复制
@JsonProperty("state")
private Object state;

Gives me this format:
{running={startedAt=2019-03-20T14:53:53Z}}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-20 16:54:32

您需要改进一下您的示例:

  • DeserializationFeature.UNWRAP_ROOT_VALUE,启用此功能来展开JSON对象。
  • JsonRootName注释添加到POJO类中,因为类名与属性containerStatuses不匹配。
  • 使用JsonNode,它来自Jackson库,而不是JSONObject,后者可能来自org.json

改进的示例如下所示:

代码语言:javascript
复制
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonRootName;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        String json = "{...}";
        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);

        ContainerStatus cs = mapper.readValue(json, ContainerStatus.class);
        System.out.println(cs.getState());
    }
}

@JsonRootName("containerStatuses")
class ContainerStatus {

    @JsonProperty("name")
    private String name;
    @JsonProperty("state")
    private JsonNode state;
    @JsonProperty("lastState")
    private JsonNode lastState;
    @JsonProperty("ready")
    private Boolean ready;
    @JsonProperty("restartCount")
    private Integer restartCount;
    @JsonProperty("image")
    private String image;
    @JsonProperty("imageID")
    private String imageID;
    @JsonProperty("containerID")
    private String containerID;

    // getters, setters, toString
}

以上代码打印:

代码语言:javascript
复制
{"terminated":{"exitCode":1,"reason":"Error","startedAt":"2019-03-20T15:40:08Z","finishedAt":"2019-03-20T15:40:50Z","containerID":"docker://"}}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55265312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档