【问题标题】:JSON parsing with GSON with same name in objects & arrays对象和数组中具有相同名称的 GSON 解析 JSON
【发布时间】:2016-07-19 06:56:00
【问题描述】:

我有 json 响应,其中有同名的数组和对象。我无法用 GSON 解析它。用 Gson 解析那种 json 响应是不可能的吗?或者,有什么方法可以用 GSON 解析响应?

响应示例:

 {
      "content": [
                   {
                     "type": "text",
                      "content": "adnan",
                      "class": "32",
                      "align": "1"
                   },
                   {
                     "type": "image",
                     "image": "http://adnanul.jpg",
                     "width": 590,
                     "content": "sarkar",
                     "height": 332,
                     "link": "http://hashtagfail.com/post/44606137082/mobile-services-android-serialization-gson",
                     "caption": "3",
                     "class": "332"
                   }
               ]
            }

【问题讨论】:

  • 你是怎么做到的?
  • 添加异常,但在 GSON 中使用这个 JSON 应该不会有任何问题。
  • Drup Desai 已经发布了一个不错的答案,但是看看你的解析代码会很有趣。
  • 异常是:com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: 应为字符串,但在第 1 行第 26643 列路径 $.data[1].content[27].content 为 BEGIN_ARRAY

标签: android json parsing gson


【解决方案1】:

错误 -

Exception is: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY at line 1 column 26643 path $.data[1].content[27].content 

问题在于,内容字段中的内容字段是一个数组而不是字符串,这在您的代码示例中没有显示,但这就是异常的含义。可能在某些情况下内容是一个字符串,在某些情况下是一个数组。

这是一个类似的问题和答案 - Gson - Same field name, different types

【讨论】:

    【解决方案2】:

    是的,可以存档此回复。

        public class ContentEntity {
    
            private ArrayList<Content> content;
    
            public class Content {
                private String type;
                private String image;
                private int width;
                private int height;
                private String content;
                private String link;
                private String caption;
                @SerializedName("class")
                private String className;
    
    // Add getter and setter here
            }
        }
    

    在使用 GSON 解析时尝试使用以下实体。

    【讨论】:

    • 你遇到了什么异常。
    • com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: 应为字符串,但在第 1 行第 26643 列路径 $.data[1].content[27].content 处为 BEGIN_ARRAY
    • 我认为你的 json 不是以 Json 对象开头的,它必须以 Json 数组开头
    【解决方案3】:

    使用默认表示可能会导致这种情况,因为您有同名的键。也许编写一个自己的反序列化器会有所帮助。

    假设您有一个 Java 类名“Content”,而 json-String 表示此对象的数组:

    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(Content.class, new MyBrandNewContentDeserializer());
    
    Gson gson = gsonBuilder.create();
    Content[] conts = gson.fromJson(jsonInput, Content.class);
    

    在反序列化器中,您可以对字符串类型“内容”做出反应

    【讨论】:

      【解决方案4】:

      尝试使用 http://www.jsonschema2pojo.org/ 。只需提供您的 json ,选择 JSON 作为源类型,然后选择 Gson 作为注释样式。它将生成一个 POJO 类

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多