【问题标题】:How to parse a JSON using GSON, to get JSONObject where it is not parsed as desired for a bad JSON?如何使用 GSON 解析 JSON,以获取 JSONObject 未按需要解析的错误 JSON?
【发布时间】:2018-10-11 10:08:19
【问题描述】:

问题是,当我使用 GSON 库解析以下 JSON 时,我得到 GSON 类的 >POJO,其中每个键和值都有一个 getter 和 setter。

请参阅下面的错误 JSON 示例,因为 GSON 库没有正确解析

现在这不是我需要的格式。相反,我想要一个 hashmap 对象作为返回(库可以返回 ArrayList,那么为什么不返回 TreeHashMap?)。对我来说,这部分 JSON 没有按照我的意愿被 GSON 解析。

我的问题是我是否应该要求我的后端团队像下面的第二个 JSON 那样重新格式化 JSON,或者尝试使用 GSON 库,但以编程方式从 JSON 中提取 JSONObject,其中键本质上是动态的,并且不确定是否有几个这样的键,或者在 返回的 JSON

请参阅下面的 good JSON 格式示例,它是从我提供的 bad JSON 转换而来的,因为它可以很容易地被 GSON 到我想要的格式

为此,要么我必须向我的后端团队解释一条规则:

规则:

键本质上不应是动态的。如果键是动态的,则还应在相同的 JSON 或单独的 MODEL JSON 中定义可搜索键的列表,这应该在此之前的调用中请求 JSON 被解析(在单独的 Web 服务 API 响应中)。

错误 JSON 示例:

{"Grocery": [
      {
        "id": 2,
        "name": "Kirana Store",
        "parent_id": 1,
        "category_image": "",
        "category_type": "product",
        "position": 0,
        "front_status": 0,
        "slug_url": "daal-pulses",
        "created_at": "2016-06-27 06:44:59",
        "updated_at": "2018-02-13 04:55:33"
      },
      {
        "id": 3,
        "name": "Departmental Store",
        "parent_id": 1,
        "category_image": "",
        "category_type": "product",
        "position": 0,
        "front_status": 0,
        "slug_url": "dry-fruits",
        "created_at": "2016-06-27 06:45:12",
        "updated_at": "2018-02-13 04:56:01"
      }
    ]}

并且可能有数千个动态键,例如“Grocery”,例如“Stationary”、“Hosiery”、“Medicines”等等……作为产品类别。 GSON 将为每个这样的动态键生成 getter。

应由网络服务 API 更正并返回为:

{

  "Products": [

    {

      "parent_category": "Grocery",

      "items": [

        {

          "id": 2,

          "name": "Kirana Store",

          "parent_id": 1,

          "category_image": "",

          "category_type": "product",

          "position": 0,

          "front_status": 0,

          "slug_url": "daal-pulses",

          "created_at": "2016-06-27 06:44:59",

          "updated_at": "2018-02-13 04:55:33"

        },

        {

          "id": 3,

          "name": "Departmental Store",

          "parent_id": 1,

          "category_image": "",

          "category_type": "product",

          "position": 0,

          "front_status": 0,

          "slug_url": "dry-fruits",

          "created_at": "2016-06-27 06:45:12",

          "updated_at": "2018-02-13 04:56:01"

        }

      ]

    }

  ]

}

如上所述,Grocery 可能有数千个类别,并且无法在运行时计算此类键的 getter。但是,如果这些键被转换为值,每个都由一个公共键表示,如上面的更正,那么为该键“parent_category”使用一个公共 getter 是有意义的。现在,这是 GSON 可以解析为我想要的输出的 JSON。但问题是我们的后端团队不合作改变任何东西,因为这里有重新工作。如果我切换到传统的解析,我也会有大量的返工。

或者我必须找到一种方法,可以使用 GSONJSON 中提取 JSONObject,以便手动解析它。

因此,我需要一些东西来节省这次返工的时间。

【问题讨论】:

    标签: android json gson


    【解决方案1】:

    得到GSON未按要求解析的JSONObject后:

    Getting JSONObject from JSON where it is not parsable by GSON:

    使用JSONObjectkeySet()JSON 获取密钥,作为Set 集合。遍历 Set 中的键,我在当前的JSON 部分中获得了相应的值。

    请看示例:

    Java Code Examples for org.json.JSONObject.keySet()

    现在如果GSON 无法解析这种JSON 格式,它为每个键提供getter 和setter,如果开发人员必须手动解析JSON,那么仍然有节省时间的机会,使用此解决方案。但是在GSON 按照您的建议进行修改之前,您必须接受这个解决方案。

    如果我在 GSON 开发团队,我应该怎么做?:

    应该有另一种注释,而不是获取 getter 和 setter,应该能够要求 GSON 库以 POJO 的 hash-maparray-list 的形式返回 key-value 对在输出中。目前没有这个。

    快乐编码 ;-)

    【讨论】:

    • @Vivek Mishra 我不明白,有一个答案如何从 GSON 获取 JSON 对象,对吧?您没有从 GSON 库中获得所需的输出,因为它很少为这样的 JSONObject 返回 POJO,其中键本质上是动态的。请为我解答。
    • 而不是过度依赖 Gson 来做解析,你总是可以在任何你想要的数据结构中手动解析它。
    • @Vivek Mishra,当然,先生,但在我的情况下,我使用了 GSON,现在我必须节省时间,因为很多时间会花在返工上。完成项目的时间表不允许我。 GSON 绝对可以节省大量时间。
    • 我完全不反对你的帖子。我只是说要改写您的答案,以删除诸如“此库有什么用途?”之类的内容。这本身就是一个问题。所以这就是我要改写的意思。
    • 我的意思是说它对我没有用,因为我没有遇到过这个问题,但对遇到这个问题的人会有用。
    猜你喜欢
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多