如何使用GSON解析JSON,以获取未针对不良JSON进行解析的JSONObject?

时间:2018-10-11 10:08:20

标签: android json gson

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

请参阅下面的示例 JSON ,因为 GSON 库未正确解析

现在这不是我要求的格式。相反,我想要一个返回的哈希映射对象(库可以返回ArrayList,然后为什么不返回TreeHashMap?)。对我来说,我不希望GSON解析JSON的这一部分。

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

请参见下面的 good JSON 格式示例,该格式是从我提供的 bad JSON转换而来的,因为< strong> 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将为每个这样的动态密钥进行吸气剂。

应该由网络服务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”使用一个通用的吸气剂就很有意义。现在,这是 GSON 可以解析为我想要的输出的 JSON 。但事实是,我们的后端团队不合作更改任何东西,因为这里有返工。如果我改用传统解析,那么最终也将需要大量的工作。

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

因此,我需要一些节省时间的东西,以便进行这项返工。

1 个答案:

答案 0 :(得分:0)

获取未按需由GSON解析的JSONObject后:

Getting JSONObject from JSON where it is not parsable by GSON

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

请参见示例:

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

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

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

应该有另一种注释,它应该能够从GSON库中以key-value的形式返回hash-map对,而不是获取getter和setter。或输出中POJO的array-list。目前不存在。

快乐编码;-)