Gson,如何反序列化数组或空字符串

我试图将此json反序列化为对象数组:

[{ "name": "item 1", "tags": ["tag1"] }, { "name": "item 2", "tags": ["tag1","tag2"] }, { "name": "item 3", "tags": [] }, { "name": "item 4", "tags": "" }] 

我的java类看起来像这样:

 public class MyObject { @Expose private String name; @Expose private List tags = new ArrayList(); } 

问题是json的tags属性,它可以只是空字符串或数组。 现在gson给了我错误: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING

我应该如何反序化这个json?

我对这个json没有任何控制权,它来自第三个pary api。

我对这个json没有任何控制权,它来自第三个pary api。

如果您无法控制数据,那么我认为最佳解决方案是创建自定义反序列化器:

 class MyObjectDeserializer implements JsonDeserializer { @Override public MyObject deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { JsonObject jObj = json.getAsJsonObject(); JsonElement jElement = jObj.get("tags"); List tags = Collections.emptyList(); if(jElement.isJsonArray()) { tags = context.deserialize(jElement.getAsJsonArray(), new TypeToken>(){}.getType()); } //assuming there is an appropriate constructor return new MyObject(jObj.getAsJsonPrimitive("name").getAsString(), tags); } } 

是什么呢,它检查"tags"是否是JsonArray 。 如果是这种情况,它会像往常一样反序列化它,否则你不要触摸它,只需用空列表创建你的对象。

一旦你编写了它,你需要在JSON解析器中注册它:

 Gson gson = new GsonBuilder().registerTypeAdapter(MyObject.class, new MyObjectDeserializer()).create(); //here json is a String that contains your input List myObjects = gson.fromJson(json, new TypeToken>(){}.getType()); 

运行它,我得到输出:

 MyObject{name='item 1', tags=[tag1]} MyObject{name='item 2', tags=[tag1, tag2]} MyObject{name='item 3', tags=[]} MyObject{name='item 4', tags=[]} 

在将json转换为object之前,将字符串"tags": ""替换为"tags": "" with "tags": []

您正在混合数据类型。 你不能同时拥有一个数组和一个字符串。 更改

 "tags": "" 

 "tags": null 

你很高兴。

使用GSON的fromJson()方法对您的JSON进行序列化。

您可以通过以下示例更好地理解这一点:

 import java.util.ArrayList; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonParser; public class JsonToJava { /** * @param args */ public static void main(String[] args) { String json = "[{\"firstName\":\"John\", \"lastName\":\"Doe\", \"id\":[\"10\",\"20\",\"30\"]}," + "{\"firstName\":\"Anna\", \"lastName\":\"Smith\", \"id\":[\"40\",\"50\",\"60\"]}," + "{\"firstName\":\"Peter\", \"lastName\":\"Jones\", \"id\":[\"70\",\"80\",\"90\"]}," + "{\"firstName\":\"Ankur\", \"lastName\":\"Mahajan\", \"id\":[\"100\",\"200\",\"300\"]}," + "{\"firstName\":\"Abhishek\", \"lastName\":\"Mahajan\", \"id\":[\"400\",\"500\",\"600\"]}]"; jsonToJava(json); } private static void jsonToJava(String json) { Gson gson = new Gson(); JsonParser parser = new JsonParser(); JsonArray jArray = parser.parse(json).getAsJsonArray(); ArrayList lcs = new ArrayList(); for (JsonElement obj : jArray) { POJO cse = gson.fromJson(obj, POJO.class); lcs.add(cse); } for (POJO pojo : lcs) { System.out.println(pojo.getFirstName() + ", " + pojo.getLastName() + ", " + pojo.getId()); } } 

}

POJO课程:

 public class POJO { private String firstName; private String lastName; private String[] id; //Getters and Setters. 

我希望这能解决你的问题。

使用Jacskon Object Mapper

见下面简单的例子

[ http://www.mkyong.com/java/how-to-convert-java-object-to-from-json-jackson/%5D [1 ]

jackson式的安全性比Gson好。 有时你会在Gson中进行stackoverflow。