2017-02-21 19 views
0

Я использую Gson и хочу десериализовать следующие альтернативы JSON в один класс Values. В последнем случае я хотел бы получить List всего лишь одного элемента. Есть ли способ сделать это в Gson без необходимости писать собственный десериализатор?Deserialize значение, которое может быть массивом или атомом

//Array: 
{ 
    "Value": [205.4, 13.5] 
} 

//Single value: 
{ 
    "Value": 205.4 
} 

Deserialize как в:

public static class Values { 
     private List<Double> Value; 
} 
+0

http://stackoverflow.com/a/42318301/166589 –

ответ

0

Как @BornToCode упоминалось решение заключается в написании пользовательских TypeAdapter и зарегистрировать его с GsonBuilder:

public class ListTypeAdapter extends TypeAdapter<List<Double>> { 

    @Override 
    public void write(final JsonWriter writer, final List<Double> doubles) throws IOException { 
    writer.beginArray(); 
    for (final double value : doubles) { 
     writer.value(value); 
    } 
    writer.endArray(); 
    } 

    @Override 
    public List<Double> read(final JsonReader reader) throws IOException { 
    final List<Double> doubles = new ArrayList<>(); 

    if (reader.peek() == JsonToken.BEGIN_ARRAY) { 
     reader.beginArray(); 
     while (reader.hasNext()) { 
     doubles.add(reader.nextDouble()); 
     } 
     reader.endArray(); 
    } else { 
     doubles.add(reader.nextDouble()); 
    } 
    return doubles; 
    } 
} 

Зарегистрируйте:

GSONBUILDER.registerTypeAdapter(new TypeToken<List<Double>>(){}.getType(), 
    new ListTypeAdapter().nullSafe()); 
1

Там нет никакого способа сделать это в Gson, если не с помощью пользовательских TypeAdapter.

public class AwesomeType extends ArrayList<Double> { 
    ... 
} 

public class AwesomeTypeAdapter extends TypeAdapter<AwesomeType> { 
    @Override 
    public void write(JsonWriter out, AwesomeType value) throws IOException { 
     ... 
    } 

    @Override 
    public AwesomeType read(JsonReader in) throws IOException { 
     AwesomeType result = new AwesomeType(); 
     if (in.peek() == JsonToken.BEGIN_ARRAY) { 
      in.beginArray(); 
      while (in.peek() != JsonToken.END_ARRAY) 
       result.add(in.nextDouble()); 
      in.endArray(); 
     } else { 
      result.add(in.nextDouble()); 
     } 
     return result; 
    } 
} 

Зарегистрировать данный тип адаптера к вашему Gson и использовать этот класс в модели вместо List<Double>.