java jackson反序列化与不同类型的嵌套对象

时间:2017-08-26 10:18:48

标签: java json jackson

我有json字段如下。如何将其反序列化为String,String Map?

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的实例   令牌在[来源:UNKNOWN; line:-1,column:-1](通过引用   chain:java.util.LinkedHashMap [“media”])

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

根据模型

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

sMap<String,String>,但JSON中的media似乎是Object(可能是Map<String, Map<String,String>>

"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()

然后进一步投射对象。

答案 1 :(得分:0)

我已经解决了下面的问题

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