GSON,如何反序列化数组或空字符串 [英] Gson, how to deserialize array or empty string
问题描述
我想这个JSON反序列化对象的数组:
[{
名:第1项
标签:标签1]
},
{
名:项目2
标签:TAG1,标签2]
},
{
名:项目3
标签:[]
},
{
名:项目4,
标签:
}]
我的Java类看起来是这样的:
公共类为MyObject
{
@暴露
私人字符串名称; @暴露
私人列表<串GT;标签=新的ArrayList<串GT;();
}
问题是JSON的标签属性,它可以只是空字符串或数组。眼下GSON给我的错误: com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期BEGIN_ARRAY但STRING
我应该如何反序列化此JSON?
我没有任何控制这JSON,它来自3 pary API。
我没有任何控制这JSON,它来自3 pary API。
块引用>如果你没有在数据的控制,你最好的办法是在我看来,创建一个自定义解串器:
类MyObjectDeserializer实现JsonDeserializer<&MyObject的GT; {
@覆盖
公众为MyObject反序列化(JsonElement JSON,类型typeOfT,JsonDeserializationContext上下文)抛出JsonParseException {
JSONObject的jObj = json.getAsJsonObject();
JsonElement jElement = jObj.get(标签);
清单<串GT;标记= Collections.emptyList();
如果(jElement.isJsonArray()){
标签= context.deserialize(jElement.getAsJsonArray(),新TypeToken<名单,LT;弦乐>方式>(){}的getType());
}
//假设有一个合适的构造函数
返回新MyObject来(jObj.getAsJsonPrimitive(name)的符getAsString(),标签);
}
}它做什么它,它会检查是否
标签
是JsonArray
与否。如果是这样的话,它反序列化像往常一样,否则你不要去碰它,只是用一个空列表创建的对象。一旦你已经写了,你需要的JSON解析器内注册它:
GSON GSON =新GsonBuilder()registerTypeAdapter(MyObject.class,新MyObjectDeserializer())创建()。
//这里JSON是包含您输入的字符串
清单<&MyObject的GT; myObjects = gson.fromJson(JSON,新TypeToken<名单,LT;为MyObject>>(){}的getType());运行它,我得到作为输出:
MyObject的{名='项目1',标签= [标签1]}
为MyObject {名称=第2项,标签= [TAG1,TAG2]}
为MyObject {名='项目3',标签= []}
为MyObject {名='项目4',标签= []}I trying to deserialize this json to array of objects:
[{ "name": "item 1", "tags": ["tag1"] }, { "name": "item 2", "tags": ["tag1","tag2"] }, { "name": "item 3", "tags": [] }, { "name": "item 4", "tags": "" }]
My java class looks like this:
public class MyObject { @Expose private String name; @Expose private List<String> tags = new ArrayList<String>(); }
The problem is json's tags property which can be just empty string or array. Right now gson gives me error:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING
How should I deserialize this json?
I do not have any control to this json, it comes from 3rd pary api.
解决方案I do not have any control to this json, it comes from 3rd pary api.
If you don't have the control over the data, your best solution is to create a custom deserializer in my opinion:
class MyObjectDeserializer implements JsonDeserializer<MyObject> { @Override public MyObject deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { JsonObject jObj = json.getAsJsonObject(); JsonElement jElement = jObj.get("tags"); List<String> tags = Collections.emptyList(); if(jElement.isJsonArray()) { tags = context.deserialize(jElement.getAsJsonArray(), new TypeToken<List<String>>(){}.getType()); } //assuming there is an appropriate constructor return new MyObject(jObj.getAsJsonPrimitive("name").getAsString(), tags); } }
What it does it that it checks whether
"tags"
is aJsonArray
or not. If it's the case, it deserializes it as usual, otherwise you don't touch it and just create your object with an empty list.Once you've written that, you need to register it within the JSON parser:
Gson gson = new GsonBuilder().registerTypeAdapter(MyObject.class, new MyObjectDeserializer()).create(); //here json is a String that contains your input List<MyObject> myObjects = gson.fromJson(json, new TypeToken<List<MyObject>>(){}.getType());
Running it, I get as output:
MyObject{name='item 1', tags=[tag1]} MyObject{name='item 2', tags=[tag1, tag2]} MyObject{name='item 3', tags=[]} MyObject{name='item 4', tags=[]}
这篇关于GSON,如何反序列化数组或空字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!