2015-04-19 2 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[].

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, чтобы преобразовать массив «Тип» в запятую 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: «Тип»: «A, B, C, D» –

+0

Вы верны. я неправильно понял. –

+0

Я думаю, что он должен изменить свой JSON так, чтобы «Type» на самом деле был массивом JSON. Это дало бы ему более чистую реализацию вместо того, чтобы скрывать то, что по существу является массивом внутри строки, разделенной запятой. –

Смежные вопросы