Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 反序列化可以是数组或原子的值_Java_Json_Gson - Fatal编程技术网

Java 反序列化可以是数组或原子的值

Java 反序列化可以是数组或原子的值,java,json,gson,Java,Json,Gson,我使用的是Gson,希望将以下JSON备选方案反序列化到同一个类值中。在后一种情况下,我希望只收到一个元素的列表。有没有一种方法可以在Gson中实现这一点,而不必编写自定义反序列化程序 //Array: { "Value": [205.4, 13.5] } //Single value: { "Value": 205.4 } 将两者反序列化为: public static class Values { private List<Double> Value; }

我使用的是Gson,希望将以下JSON备选方案反序列化到同一个类
值中。在后一种情况下,我希望只收到一个元素的
列表。有没有一种方法可以在Gson中实现这一点,而不必编写自定义反序列化程序

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

//Single value:
{
  "Value": 205.4
}
将两者反序列化为:

public static class Values {
      private List<Double> Value;
}
公共静态类值{
私有列表值;
}

在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;
    }
}
公共类AwesomeType扩展了ArrayList{
...
}
公共类AwesomeTypeAdapter扩展了TypeAdapter{
@凌驾
public void write(JsonWriter out,AwesomeType值)抛出IOException{
...
}
@凌驾
公共AwesomeType read(JsonReader in)引发IOException{
AwesomeType结果=新的AwesomeType();
if(in.peek()==JsonToken.BEGIN\u数组){
in.beginArray();
while(在.peek()!=JsonToken.END_数组中)
result.add(在.nextDouble()中);
in.endArray();
}否则{
result.add(在.nextDouble()中);
}
返回结果;
}
}

将此类型适配器注册到您的Gson,并在您的模型中使用此类,而不是@BornToCode提到的
List

解决方案是编写自定义
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;
  }
}
公共类ListTypeAdapter扩展了TypeAdapter{
@凌驾
公共void write(最终JsonWriter writer,最终列表加倍)引发IOException{
writer.beginArray();
用于(最终双精度值:双精度){
作者:价值(价值);
}
writer.endArray();
}
@凌驾
公共列表读取(最终JsonReader读取器)引发IOException{
最终列表加倍=新的ArrayList();
if(reader.peek()==JsonToken.BEGIN\u数组){
reader.beginArray();
while(reader.hasNext()){
doubles.add(reader.nextDouble());
}
reader.endArray();
}否则{
doubles.add(reader.nextDouble());
}
双打;
}
}
注册:

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