【问题标题】:Jackson json deserialization with integer(primitive data) as the key into POJO杰克逊 json 反序列化以整数(原始数据)作为 POJO 的关键
【发布时间】:2016-09-13 09:36:48
【问题描述】:

在其中一个 API 中,我收到了 Json 响应: 您可以在此处查看此响应示例Sample Json resopnse

{
    "histogram" : {
        "1" : "12",
        "2" : "20",
        "3" : "50",
        "4" : "90",
        "5" : "10"
     }
}

为了反序列化这个响应,如何编写 POJO 类?

在java中,由于我们不允许将数字作为变量名,如何将其转换为POJO?

例如,我怎样才能创建这样的东西:

public class MyPOJO {
    Histogram histogram;

    public static class Histogram {
        // I KNOW THIS IS WRONG !!
        String 1;
        String 2;
        String 3;
        String 4;
    }
}

jackson 是否提供任何注释来处理这些?

【问题讨论】:

    标签: java rest jackson json-deserialization


    【解决方案1】:

    对于这个 JSON:

    {
      "histogram": {
        "1": "12",
        "2": "20",
        "3": "50",
        "4": "90",
        "5": "10"
      }
    }
    

    您可以考虑以下方法之一:

    使用Map<String, String> 保存值

    histogram 可以解析成Map<String, String>

    public class HistogramWrapper {
    
        @JsonProperty("histogram")
        private Map<String, String> histogram;
    
        // Getters and setters omitted
    }
    

    使用带有@JsonProperty 注释的属性

    或者,您可以定义一个Histogram 类并使用@JsonProperty 注释其属性:

    public class HistogramWrapper {
    
        @JsonProperty("histogram")
        private Histogram histogram;
    
        // Getters and setters omitted
    }
    
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class Histogram {
    
        @JsonProperty("1")
        private String _1;
    
        @JsonProperty("2")
        private String _2;
    
        @JsonProperty("3")
        private String _3;
    
        @JsonProperty("4")
        private String _4;
    
        @JsonProperty("5")
        private String _5;
    
        // Getters and setters omitted
    }
    

    解析 JSON

    要解析 JSON,请执行以下操作:

    ObjectMapper mapper = new ObjectMapper();
    String json = "{\"histogram\":{\"1\":\"12\",\"2\":\"20\","
                + "\"3\":\"50\",\"4\":\"90\",\"5\":\"10\"}}";
    
    HistogramWrapper wrapper = mapper.readValue(json, HistogramWrapper.class);
    

    【讨论】:

    • 是的,这是正确的。我忘记了将直方图表示为 HashMap。直方图可以表示为键值对。谢谢:)
    • @oathkeeper 请看看我的更新。你也可以使用@JsonProperty
    • 我做到了。我不关心答案的确切准确性。这个概念要重要得多。我记住了这个概念。谢谢:)
    【解决方案2】:

    只是对 Cassio 答案的补充,以防您有这样的 Json 响应

    {
            "1": 12, 
            "3": 50, 
            "2": 20, 
            "5": 10, 
            "4": 90, 
            "7": 20, 
            "6": 322
    }
    

    您可以直接将它们来回序列化和反序列化为 HashMap。不需要 POJO。

        String jsonString = "{\"1\":\"12\",\"2\":\"20\","
                    + "\"3\":\"50\",\"4\":\"90\",\"5\":\"10\"}";
    
        HashMap<String, Integer> histogramMap;
    
        histogramMap = (new ObjectMapper()).
        readValue(jsonString, new TypeReference<HashMap<Integer, String>>(){});
    

    这样会直接保存为HashMap。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-07
      • 2015-04-07
      • 1970-01-01
      • 1970-01-01
      • 2013-05-11
      • 2014-12-18
      • 1970-01-01
      • 2011-11-11
      相关资源
      最近更新 更多