2017-02-21 69 views
0

我正在使用Gson并想将以下JSON替换反序列化为同一类Values。在后一种情况下,我希望收到只有一个元素的List。有没有办法在Gson中完成此操作,而无需编写定制解串器?反序列化可以是数组或原子的值

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

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

反序列化双双进入:

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

没有办法,除非使用自定义TypeAdapter在GSON做到这一点。

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>使用这个类。

相关问题