Java 反序列化可以是数组或原子的值
我使用的是Gson,希望将以下JSON备选方案反序列化到同一个类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中实现这一点,而不必编写自定义反序列化程序
//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());