【问题标题】:Extract array from Json object从 Json 对象中提取数组
【发布时间】:2019-09-20 06:56:20
【问题描述】:

我想使用 GSON 库从 Json 对象中提取一个数组。

我已经尝试创建类并让 Gson 库完成工作,但在这种特殊情况下它不起作用。

提取数据的类

public class Images {
        private Image[] images;

        public class Image {
            private String url;

            public Image(String url) {
                this.url = url;
            }

            public String getUrl() {
                return url;
            }
        }

        public Images(Image[] images) {
            this.images = images;
        }

        public Image[] getImages() {
            return images;
        }
    }

示例数据

...
,
"images": [
   {
     "url": "https://a.allegroimg.com/original/030516/a867b9dd4021b15678fc03a3981b"
    },
    {
       "url": "https://a.allegroimg.com/original/03da09/19740f7147ad929609cc2bcc499e"
    },
    {
        "url": "https://a.allegroimg.com/original/03198b/c024c7e448cab876bb49ad055567"
    },
    {
        "url": "https://a.allegroimg.com/original/039fee/64bae4c64dac89e5b5b4d001c2ca"
     }
],
...

我收到错误消息:“com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 283 path $.items.promoted[0].images”
我正在寻求从 json 对象中提取数据的帮助。

编辑

我只需要删除类'Images'并将'urls'从Json保存到Image[]

【问题讨论】:

  • 这是完整的json吗?或者你只是打破它并发布?在Images 上,您不需要带有setter 方法的arg 构造函数
  • 只是一部分,其余的我都没问题,就这个

标签: java json gson


【解决方案1】:

预期为 BEGIN_OBJECT,但在第 1 行第 283 列路径 $.items.promoted[0].images 处为 BEGIN_ARRAY

问题是由于包装类Images 造成的。从错误中,我认为您的对象是这样的:

class Promoted {
  private Images images;
  ..
}

class Images {
  private Image[] images;
}

在您当前的表单中,您可以解析的 json 是:

...
,
"images": {
  "images": [
    {
      "url": "https://a.allegroimg.com/original/030516/a867b9dd4021b15678fc03a3981b"
    },
    {
      "url": "https://a.allegroimg.com/original/03da09/19740f7147ad929609cc2bcc499e"
    },
    {
      "url": "https://a.allegroimg.com/original/03198b/c024c7e448cab876bb49ad055567"
    },
    {
      "url": "https://a.allegroimg.com/original/039fee/64bae4c64dac89e5b5b4d001c2ca"
    }
  ]
}
...

相反,您可以直接将数组Image[] 嵌入到父对象中(无需包装类):

class Promoted {
  private Image[] images;
  ..
}

【讨论】:

    【解决方案2】:

    您可以使用DSM 库。通过使用它,您可以在读取 JSON 数据时提取一部分 JSON。

    首先,您必须以 yaml 格式定义映射。

    映射定义:

     result:
       type: array  # expect result as array
       path: /images
       fields:
         url:
    

    使用 DSM 读取数据。

    DSM dsm=new DSMBuilder(new File("path/to/config.yaml")).create();
    Object object=dsm.toObject(new File("path/to/data.json");
    System.out.println(object);
    

    这是输出:

    [{url=https://a.allegroimg.com/original/030516/a867b9dd4021b15678fc03a3981b}, {url=https://a.allegroimg.com/original/03da09/19740f7147ad929609cc2bcc499e}, {url=https://a.allegroimg.com/original/03198b/c024c7e448cab876bb49ad055567}, {url=https://a.allegroimg.com/original/039fee/64bae4c64dac89e5b5b4d001c2ca}]
    

    如果您想获取所有 url 字段作为列表,您可以按如下方式对映射定义收费。

    result:
       type: array
       path: /images/url
    

    这个映射的输出是:

    [https://a.allegroimg.com/original/030516/a867b9dd4021b15678fc03a3981b, https://a.allegroimg.com/original/03da09/19740f7147ad929609cc2bcc499e, https://a.allegroimg.com/original/03198b/c024c7e448cab876bb49ad055567, https://a.allegroimg.com/original/039fee/64bae4c64dac89e5b5b4d001c2ca]
    

    【讨论】:

    • 他需要用Gson,用Gson也可以,为什么要用别的库呢?
    • 据我了解,他只需要 URL 列表。如果您使用 DSM,则无需编写 Java(图像和图像)类。要仅从 json 获取 url,您必须在 Gson 中制作自定义反序列化器。 DSM 允许您使用映射定义以声明方式编写自定义反序列化器。使用 DSM 进行开发速度更快,并且需要的代码更少。这是将 Gson 更改为 DSM 的一些原因。顺便说一下,DSM 同时适用于 XML 和 JSON。
    猜你喜欢
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多