将空列表反序列化为空字符串

时间:2015-10-04 15:24:18

标签: gson retrofit

我使用Retrofit从这些方案之后的API接收结果:

  • { "somekey": "somestringvalue" }
  • { "somekey": [] }
  • { "somekey": "" }

[]""实际上代表相同的值:空字符串。

所以我写了一个 TypeAdapter

public class StringAdapter extends TypeAdapter<String> {
    @Override
    public void write(JsonWriter out, String value) throws IOException {

    }

    @Override
    public String read(JsonReader in) throws IOException {
        if(in.peek() == JsonToken.BEGIN_ARRAY){
            return "";
        }
        return in.nextString();
    }
}

然后我这样注册:

Gson gson = new GsonBuilder()
                .registerTypeAdapter(String.class, new StringAdapter()).create();

RestAdapter restAdapter = new RestAdapter.Builder()
                            .setEndpoint(END_POINT)
                            .setConverter(new GsonConverter(gson))
                            .build();

但是,解析时仍然会产生同样的错误:

  

retrofit. RetrofitError com.google.gson. JsonSyntaxException java.lang. {{1 <}> :预计名称为IllegalStateException,位于第1行第85栏BEGIN_ARRAY

我想我错过了一些东西,但又是什么?

1 个答案:

答案 0 :(得分:1)

使用in.peek()检查元素,但是您需要使用输入流中的值,否则会妨碍处理下一个元素。您可以使用in.skipValue

执行此操作
@Override
public String read(JsonReader in) throws IOException {
    if (in.peek() == JsonToken.BEGIN_ARRAY) {
        in.skipValue();
        return "";
    }
    return in.nextString();
}