我使用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
我想我错过了一些东西,但又是什么?
答案 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();
}