繁体   English   中英

如何在JAX-RS中映射动态JSON

[英]How to map dynamic JSON in JAX-RS

我必须使用JAX-RS(Resteasy作为实现)将JSON映射到Java PoJos。 问题是,JSON是动态的。 看看这个例子:

{
  "typeCode": "SAMPLE",
  "data": [
    {
      "id": "COMMENTS",
      "answerValue": {
        "type": "YesNoAnswer",
        "value": true
      }
    },
    {
      "id": "CHOICE",
      "answerValue": {
        "type": "SelectListAnswer",
        "values": ["choice1", "choice2"]
      }
    }
  ]
}

动态元素位于数据数组中。 原则上,每个条目都有一个ID和一个answerValue。 但answerValue是动态的。 根据他的类型,他可以有一个值(布尔值,字符串,数字对象)或值数组。

如何将其映射到我的Java模型?

我建议您通过将answerValue节点作为JsonNode类型并将其手动处理为您需要的Java类型来处理它。

以下内容:

class Data {
    public String typeCode;
    public List<Answer> data;
}

class Answer {
    public String id;

    public void setAnswerValue(JsonNode node) {
        String type = node.path("type").asText();

        switch (type) {
            case "YesNoAnswer" :
                boolean value = node.path("value").asBoolean();
                // TODO Handle
                break;
            case "SelectListAnswer" :
                JsonNode values = node.path("values");
                for (JsonNode v : values) {
                    String s = v.textValue();
                    // TODO Handle
                }

                break;
          }
    }
}

然后可以使用ObjectMapper读取您的输入:

ObjectMapper om = new ObjectMapper();
Data data = om.readValue(input, Data.class);

感谢@Henrik的解决方案。 在实施他的提案时,我找到了一个不同的解决方案,这对我来说更适合。 我只是使用JsonSubTypes Annotation来处理继承。 这是我的例子:

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;

@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.PROPERTY,
        property = "type")
@JsonSubTypes({
        @JsonSubTypes.Type(value = YesNoAnswer.class, name = "YesNoAnswer"),
        @JsonSubTypes.Type(value = SelectListAnswer.class, name="SelectListAnswer"),
        @JsonSubTypes.Type(value = SelectAddressAnswer.class, name="SelectAddressAnswer")})
abstract class RequestFormAnswer {

    private String type;

}

暂无
暂无

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

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