有什么想法在gson中反序列化混合的json字符串?

时间:2014-03-23 16:41:31

标签: java json deserialization gson pojo

我可能很容易向高级json / gson用户提问。我得到了类似下面的请求:

[{ 
 "1": {
    "2": "6+"
  }   
},{ 
  "1": []
}]

我尝试使用gson将其反序列化为java对象,但我遇到了问题。 Gson向我汇报:

java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line X column Y

我认为问题在于第一项' 1' value被声明为一个对象,在第二个和数组中。我对生成的JSON没有影响力。知道如何正确映射吗?

也许在gson中我可以添加一些钩子并且在解析期间会影响应该对项目做什么?例如。当项目" 1"价值是" []"然后做一些与给出具有值的对象不同的东西?

在Arkain发表评论后,我必须补充:

  1. 在提供的示例中,我们仍然拥有相同的对象 - 但它的呈现方式不同:/(一次为空数组 - 其他时间为对象)
  2. 从分析中我认为Object应该表示为例如。

    public class Example {
    Map<String, Object> 1 = new Map<String,Object>;
    ...
    }
    

    但我不知道为什么当map为空时在JSON中表示为空数组。

  3. 我不知道JSON集合中特定职位的位置和类型。

1 个答案:

答案 0 :(得分:0)

要解决问题我从那里使用关于自定义反序列化器的答案: Gson deserialize json with varying value types

我创建了自己的反序列化器类,我忽略了数组类型(总是空的,我不需要它们):

public class InternalAttributeDeserializer implements JsonDeserializer<Attributes> {

@Override
public Attributes deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException {

    Attributes attrs = new Attributes();
    LinkedTreeMap<String, Object> map = context.deserialize(jsonElement, LinkedTreeMap.class);

    for (String key : map.keySet()) {
        Object obj = map.get(key);

        if (obj instanceof LinkedTreeMap) {
            @SuppressWarnings("unchecked")
            LinkedTreeMap<String, String> imap = (LinkedTreeMap<String, String>) obj;

            for (String ikey : imap.keySet()) {
                AttributeInProduct iattr = new AttributeInProduct();
                iattr.setPres_id(key);
                iattr.setAttribute_id(ikey);
                iattr.setValue(imap.get(ikey));
                attrs.addAttribute(iattr);
            }

        }

    }

    return attrs;
}

}