gpt4 book ai didi

android - Json语法异常 : Expected a String but was NAME

转载 作者:搜寻专家 更新时间:2023-11-01 08:43:48 25 4
gpt4 key购买 nike

我在解析来自第 3 方的 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();

这是我的类型适配器

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: Expected a string but was NAME at line 1 column 622 path $.field_head_picture.

这是我的 FieldHeadPicture 类

public class FieldHeadPicture {

@SerializedName("und")
private List<Und> und;

public List<Und> getListFieldAdditionalPicture() {
return und;
}

public FieldHeadPicture() {
}
}

最佳答案

我认为您不想在 JsonReader 上调用 nextString(),而是使用您已经创建的 Gson 实例直接反序列化包含的对象而不是一个新的。换句话说,您的 else 子句变得很简单:

    } else if (peek == JsonToken.BEGIN_OBJECT) {
return gson.fromJson(jsonReader, FieldHeadPicture.class);
}

这种方式也不需要 beginObject()/endObject()。如果这不起作用,请告诉我,我可以为您发布测试用例。

关于android - Json语法异常 : Expected a String but was NAME,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30337915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com