我可能很容易向高级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发表评论后,我必须补充:
从分析中我认为Object应该表示为例如。
public class Example {
Map<String, Object> 1 = new Map<String,Object>;
...
}
但我不知道为什么当map为空时在JSON中表示为空数组。
答案 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;
}
}