【问题标题】:Any idea of deserialize mixed json string in gson?在gson中反序列化混合json字符串的任何想法?
【发布时间】:2014-04-30 21:15:53
【问题描述】:

我可能对高级 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' 值被声明为对象,而在第二项中,值被声明为数组。我对生成的 JSON 没有影响。知道如何正确映射吗?

也许在 gson 中我可以添加一些钩子,并且在解析期间会影响应该如何处理项目?例如。当项目“1”的值为“[]”时,做一些不同于给定具有值的对象时的事情?

在 Arkain 评论之后我必须添加:

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

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

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

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

【问题讨论】:

  • 这是合法的 JSON,只需反序列化即可。 (你有一个包含两个“对象”的数组。第一个有一个值是另一个“对象”,第二个有一个值是一个数组。这不会很好地反序列化为 POJO——你必须处理它作为数组和对象。)

标签: java json deserialization gson pojo


【解决方案1】:

为了解决问题,我从那里使用关于自定义反序列化器的答案: 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;
}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多