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

Deserialize string considering empty list as empty string

我正在使用 Retrofit 接收来自 API 以下论文方案的结果:

其中 []"" 实际上表示相同的值:一个空字符串。

所以我写了一个 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.IllegalStateException: Expected a name but was BEGIN_ARRAY at line 1 column 85 path $.Data.Classified

我想我误会了什么,但是什么?

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

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