【问题标题】:java jackson deserialization with different type of nested objectsjava jackson 使用不同类型的嵌套对象反序列化
【发布时间】:2017-08-26 10:18:48
【问题描述】:

我有如下的 json 字段。如何将其反序列化为字符串、字符串映射?

s:{
    "g":0.0,
    "p":0.0,
    "m":0.0,
    "media":{
        "1":{"key":0,"value":0},
        "2":{"key":0,"value":0},
        "3":{"key":0,"value":0},
        "4":{"key":0,"value":0},
        ...},
    "pr":{
        "1":{"key":0,"value":0},
        "2":{"key":0,"value":0},
        "3":{"key":0,"value":0},
    ...}
    }

我试过这样

        public JsonNode s;
        @JsonGetter("s")
        public Map<String,String> getS() {
            if (s == null) {
                return null;
            }
            ObjectMapper mapper = new ObjectMapper();
            Map<String, Object> map;
            map = mapper.convertValue(score, new TypeReference<Map<String, Object>>(){});
            Map<String,String> result;
            for (Map.Entry<String, Object> entry : map.entrySet()) {
                if(entry.getValue() instanceof String){
                    result.put(entry.getKey(), (String) entry.getValue());
                }
            }
            return result;
        }

它可以用于测试,但是我收到下一个真实数据错误

无法从 START_OBJECT 中反序列化 java.lang.String 的实例 [来源:未知;行:-1,列:-1](通过引用 链:java.util.LinkedHashMap["media"])

有什么建议吗?

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

    根据型号

    @JsonGetter("s")
    public Map<String,String> getS()
    

    sMap&lt;String,String&gt;,但 JSON 中的 media 似乎是 Object(可能是 Map&lt;String, Map&lt;String,String&gt;&gt;

    "media":{
        "1":{"key":0,"value":0},
        "2":{"key":0,"value":0},
        "3":{"key":0,"value":0},
        "4":{"key":0,"value":0},
     ...},
    

    也许你应该使用

    @JsonGetter("s")
    public Map<String,Object> getS()
    

    然后进一步投射对象。

    【讨论】:

    • 我的尝试有什么不同?我首先转换为 map,然后转换为 map。我应该如何在你的提案中提出它?
    • @Sergei s 不是Map&lt;String, String&gt; 此外还有3级嵌套来获取media中的键值
    • 这样解决 for (Map.Entry entry : map.entrySet()) { result.put(entry.getKey(), entry.getValue().toString()) ; }
    【解决方案2】:

    我已经解决了,如下所示

    for (Map.Entry<String, Object> entry : map.entrySet()) {      
             result.put(entry.getKey(), entry.getValue().toString());
          }
    

    【讨论】:

      猜你喜欢
      • 2018-12-05
      • 2013-12-07
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 2020-09-10
      • 1970-01-01
      • 2016-10-23
      • 2016-02-17
      相关资源
      最近更新 更多