2015-04-19 193 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數組。這將給他一個更乾淨的實現,而不是隱藏在逗號分隔的字符串中基本上是一個數組。 –