我有一些Json(显示的片段),我发现使用Gson解析时很难。我可以解析json的其余部分。我读取下面的json片段的方式,我有一个名为arguments的数组,包含一个对象类型,另一个数组类型和一个字符串类型。我无法改变Json。
有没有人对如何使用Gson解析这个有任何想法?
"arguments": [
{
"codes": [
"memberRequest.email",
"email"
],
"arguments": null,
"defaultMessage": "email",
"code": "email"
},
[],
".*"
]
答案 0 :(得分:1)
这取决于您希望在Java表示中使用的数据结构。您可以选择3个选项:
选项1 List
或List<Object>
(Actualy Object
s将为LinkedHashMap
,String
,ArrayList
)
new Gson().fromJson(JSON, ParentPOJO.class);
private static class ParentPOJO{
public List<Object> arguments;
}
选项2 自定义MyListClass
,其中包含MyListClass
的自定义反序列化程序MyListClass extends ArrayList
这样您就可以控制反序列化并为对象选择适当的数据类型。这将为您MyListClass extends ArrayList
提供MyClass
,ArrayList
和String
。下面的演示。
public static void main(String[] args) {
Gson gson = new GsonBuilder().registerTypeAdapter(MyListClass.class, new CustomDeserializer()).create();
map = gson.fromJson(JSON, ParentPOJO.class);
}
private static class ParentPOJO{
public MyListClass arguments;
}
private static class MyListClass extends ArrayList{}
private static class CustomDeserializer implements JsonDeserializer{
@Override
public Object deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
MyListClass list = null;
if (json.isJsonArray()){
list = new MyListClass();
JsonArray array = json.getAsJsonArray();
for(int i = 0; i< array.size();i++){
Object next = parseNext(array.get(i),context);
list.add(next);
}
}
return list;
}
private Object parseNext(JsonElement json, JsonDeserializationContext context){
if (json.isJsonArray()){
return context.deserialize(json, Object.class);//can change object type if you know it
}else if(json.isJsonPrimitive()){
return json.getAsJsonPrimitive().getAsString();
}else if(json.isJsonObject()){
return context.deserialize(json, MyClass.class);
}
return null;
}
}
public class MyClass {
@SerializedName("codes")
private List<String> codes = new ArrayList<String>();
@SerializedName("arguments")
private Object arguments;
@SerializedName("defaultMessage")
private String defaultMessage;
@SerializedName("code")
private String code;
}
选项3 几乎完全相同,但MyPOJOClass
代替MyListClass
只需更改反序列化器,向MyPOJOClass
添加字段并将json数组映射到pojo反序列化器中的字段。如果您选择自定义MyPOJOClass
如果你的json数组中有多个相同类型的对象,你必须提出某种算法来解析它们。