我在解析第三方的JSON方面遇到了一些问题。
"field_head_picture":{
"und":[
{
"fid":"11917",
"uid":"1",
"filename":"fr_bril_id_promo.jpg",
"uri":"public://fr_bril_id_promo.jpg",
"filemime":"image/jpeg",
"filesize":"12744",
"status":"1",
"timestamp":"1429724219",
"uuid":"bb8c1a73-451c-4e17-9001-146c6e06f255",
"display":"1",
"description":""
}
]
}
有时会返回
"field_head_picture":[
],
如您所见,它返回一个对象或一个空数组。我知道这是糟糕的JSON设计,但我无法改变它..
所以我写了一个TypeAdapter
FieldHeadPictureTypeAdapter headPictureTypeAdapter = new FieldHeadPictureTypeAdapter();
return new GsonBuilder()
.registerTypeAdapter(FieldHeadPicture.class, headPictureTypeAdapter)
.create();
这是我的TypeAdapter
public class FieldHeadPictureTypeAdapter extends TypeAdapter<FieldHeadPicture> {
private Gson gson = new Gson();
@Override
public void write(JsonWriter out, FieldHeadPicture value) throws IOException {
gson.toJson(value, FieldHeadPicture.class, out);
}
@Override
public FieldHeadPicture read(JsonReader jsonReader) throws IOException {
try {
JsonToken peek = jsonReader.peek();
if (peek == JsonToken.BEGIN_ARRAY) {
jsonReader.beginArray();
jsonReader.endArray();
return new FieldHeadPicture();
} else if (peek == JsonToken.BEGIN_OBJECT) {
jsonReader.beginObject();
FieldHeadPicture picture = new Gson().fromJson(jsonReader.nextString(), FieldHeadPicture.class);
jsonReader.endObject();
return picture;
}
} catch (Exception e) {
return new FieldHeadPicture();
}
return new FieldHeadPicture();
}
如果数组为空,我只想返回一个空的FieldHeadPicture,否则解析为FieldHeadPicture对象。 但是我收到了错误
java.lang.IllegalStateException:期望一个字符串,但是第1行第622行的NAME路径$ .field_head_picture。
这是我的FieldHeadPicture类
public class FieldHeadPicture {
@SerializedName("und")
private List<Und> und;
public List<Und> getListFieldAdditionalPicture() {
return und;
}
public FieldHeadPicture() {
}
}
答案 0 :(得分:3)
我认为你不想在nextString()
上调用JsonReader
,而是直接反序列化所包含的对象,使用你已经创建的Gson实例而不是新实例。换句话说,你的else子句变得简单:
} else if (peek == JsonToken.BEGIN_OBJECT) {
return gson.fromJson(jsonReader, FieldHeadPicture.class);
}
也不需要这样beginObject()
/ endObject()
。如果这不起作用,请告诉我,我可以为您发布测试用例。