将空列表视为空字符串反序列化字符串
Deserialize string considering empty list as empty string
我正在使用 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.
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();
}
我正在使用 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.
IllegalStateException
: Expected a name but wasBEGIN_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();
}