2015-04-19 156 views
1

如何定制特定字段的序列化/反序列化?自定义JSON解析(Gson)

这里是我的JSON:使用

[{ 
"Short Name": "X", 
"Address": "X Address", 
"Latitude": 40.739982, 
"Longitude": -73.978053, 
"Type": "A, B" 
}, 
{ 
"Short Name": "Y", 
"Address": "Y Address", 
"Latitude": 40.852856, 
"Longitude": -73.938098, 
"Type": "A, B, C, D" 
}] 

GSON,现在我可以解析JSON,并得到一个Java对象与 String type;但我想分裂String类型,并得到一个类型String[]

public class MyClass { 
    @SerializedName("Short Name") 
    @Expose 
    private String ShortName; 

    @Expose 
    private String Address; 

    @Expose 
    private Double Latitude; 

    @Expose 
    private Double Longitude; 

    @Expose 
    private String Type; 
    // how can I split the string 
    // and get private String[] Type; 
    // when deserializing 
} 

回答

1

您需要实现自定义类型适配器。

你可以这样做:

JsonDeserializer<String[]> deserializer = new JsonDeserializer<String[]>() { 

    @Override 
    public String[] deserialize(JsonElement jsonElem, Type type, 
      JsonDeserializationContext context) throws JsonParseException { 

     if(jsonElem == null) { 
      return null; 
     } 

     return jsonElem.getAsString().split(", "); 
    } 

}; 

Gson gson = new GsonBuilder() 
        .registerTypeAdapter(String[].class, deserializer) 
        .create(); 

Type listType = new TypeToken<ArrayList<MyClass>>() {}.getType(); 
List<MyClass> t = gson.fromJson(json, listType); 

和修改MyClass的豆来自:

@Expose 
private String Type; 

到:

@Expose 
private String[] Type; 

在你可以添加一个串行同样的方式如果您需要序列化MyClass对象以便将“Type”数组转换为String逗号分离!

+0

谢谢。我会试试这个,让你知道。 – patrick

0

简单。 Json允许您使用Numbers(Int/Long/Double),字符串,列表或对象。你需要的是一个列表。

JSON:

“类型”:{ “类型”: “阵列”, “物品”:{ “类型”: “串”}}

例如“类型”: “A”, “B”, “C”, “d”]

JAVA:

List<String> Type; 

以后你可以使用任何Java List实现例如ArrayList。

例如Type = new ArrayList();

+0

这不是问题的解决方案。他需要反序列化一个数组中的逗号分隔的字符串。这不是一个json数组:“Type”:“A,B,C,D” –

+0

你是对的。我误解了。 –

+0

我认为重点是他应该改变他的JSON,以便“Type”实际上是一个JSON数组。这将给他一个更干净的实现,而不是隐藏在逗号分隔的字符串中基本上是一个数组。 –