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

标签 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”值被声明为对象,第二项被声明为数组。我对生成的 JSON 没有影响。知道如何正确映射它吗?

也许在 gson 中我可以添加一些钩子(Hook)并且在解析过程中影响应该对项目做什么?例如。当项目“1”的值为“[]”时,则执行与给出具有值的对象时不同的操作?

在 Arkain 评论后我必须添加:

  1. 在给出的示例中,我们仍然有相同的对象 - 但它的呈现方式不同:/(一次作为空数组 - 另一次作为对象)
  2. 根据分析,我认为 Object 应该表示为 e.g.

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

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

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

最佳答案

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

关于java - 在 gson 中反序列化混合 json 字符串有什么想法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22593754/

相关文章:

java - 标记类、方法等的间接用法

java - 如何避免 OutOfMemoryError 上传文件?

python - 如何迭代 json 值并比较所有 json 值并返回 true?

java - Serializable - writeObject()/ReadObject 和 Externalizable - Java 中的 readExternal()/writeExternal() 有什么区别?

c# - 如何将 JSON 反序列化为仅 "built-in"类型

java - 使用 Libgdx 在 Eclipse 上导出平铺 map

java - 单击 JCheckBox 时添加值

ios - 解码json时出错

ios - 由于访问 Web api 时未捕获异常 'NSInvalidArgumentException' 而导致应用程序终止

C# NewtonSoft Single Object 或 Array JsonConverter 不工作,没有错误