【问题标题】:JsonSyntaxException : Expected a String but was NAMEJsonSyntaxException : 需要一个字符串但是是 NAME
【发布时间】:2015-05-19 23:35:47
【问题描述】:

我在解析来自第 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:应为字符串,但在第 1 行第 622 列路径 $.field_head_picture 处为 NAME。

这是我的 FieldHeadPicture 类

public class FieldHeadPicture {

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

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

   public FieldHeadPicture() {
   }
}

【问题讨论】:

  • 如果只使用 else if (peek == JsonToken.BEGIN_OBJECT) 之后的代码并注释掉所有 if 语句,会发生什么。

标签: android json gson retrofit


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢!这样就解决了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 2011-03-03
相关资源
最近更新 更多