有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

与具有不同数据类型的密钥同名的java JSON

在一个JSON Object中,一个值以双精度出现,有时以对象出现,其中它是一个配置驱动的API,我正在使用该值,但是POJO中是否有任何方法来标识要为具有不同数据类型的相同密钥名管理的数据类型

是否可以在POJO级别进行处理

 {
  "total": 56278160
 }

或:

 {
     "total": {
          "val1": 92444080,
          "val2": 107372544,
          "val3": 113946624
     }
 }

共 (1) 个答案

  1. # 1 楼答案

    有时,当一个字段可以存储JSON Objectprimitive时,此原语只是JSON Object的“短”表示。例如,只设置了一个字段-val1,服务只返回它,而不在JSON Object中进行包装。在这种情况下,您可以创建一个带有两个构造函数的POJO:一个用于单个Number,另一个用于所有必填字段

    import com.fasterxml.jackson.annotation.JsonCreator;
    import com.fasterxml.jackson.annotation.JsonProperty;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.SerializationFeature;
    
    public class JsonPathApp {
    
        public static void main(String[] args) throws Exception {
            ObjectMapper mapper = new ObjectMapper();
            mapper.enable(SerializationFeature.INDENT_OUTPUT);
    
            Root rootWithNumber = mapper.readValue("{\"total\": 56278160}", Root.class);
            System.out.println(rootWithNumber);
            Root rootWithObject = mapper.readValue("{\"total\": {\"val1\": 92444080, \"val2\": 107372544, \"val3\": 113946624}}", Root.class);
            System.out.println(rootWithObject);
        }
    }
    
    class Total {
        private final long val1;
        private final long val2;
        private final long val3;
    
        @JsonCreator
        public Total(long value) {
            this(value, 0, 0);
        }
    
        @JsonCreator
        public Total(@JsonProperty("val1") long val1,
                     @JsonProperty("val2") long val2,
                     @JsonProperty("val3") long val3) {
            this.val1 = val1;
            this.val2 = val2;
            this.val3 = val3;
        }
    
        // getters, toString
    }
    
    class Root {
        private Total total;
    
        // getters, setters, toString
    }
    

    以上代码打印:

    Root{total=Total{val1=56278160, val2=0, val3=0}}
    Root{total=Total{val1=92444080, val2=107372544, val3=113946624}}
    

    如果这些表示不相关,则可以使用JsonNode类型

    class Root {
        private JsonNode total;
    }
    

    然后使用isNumberisObject方法查找它是表示primitive还是JSON Object