如何解析具有相同键的不同数据类型的改造对象的json数组

Posted

技术标签:

【中文标题】如何解析具有相同键的不同数据类型的改造对象的json数组【英文标题】:How to parse json array of objects with retrofit which has different data types for same key 【发布时间】:2017-03-15 10:03:36 【问题描述】:

我在 API 响应中得到一个 json 数组,它在同一个键()中有不同的数据类型(字符串、整数和数组),但在使用 Retrofit 解析它们时出错:


 "custom_attributes": [
    
      "attribute_code": "description",
      "value": "<p>Product Features:</p>\r\n<ul>\r\n<li>100% cotton</li>\r\n<li>Round neck</li>\r\n<li>Short sleeve</li>\r\n<li>Plastisol printing technique</li>\r\n<li>Small label on side of sleeve</li>\r\n</ul>"
    ,
    
      "attribute_code": "short_description",
      "value": "<p>100% cotton round neck short sleeve tee with plastisol printing technique</p>"
    ,
    
      "attribute_code": "category_ids",
      "value": [
          "3",
          "125"
       ]
    ,
    
      "attribute_code": "special_price",
      "value": true
    ,
    
      "attribute_code": "size",
      "value": 4
    
  ]

【问题讨论】:

你遇到了什么错误? retrofit.RetrofitError: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY at line 1 column 4227 path $.custom_attributes[2].value 【参考方案1】:

我不明白保持这样的 JSON 格式有什么需要。

根据 json.org:

JSON 建立在两种结构之上:

• 名称/值对的集合。在各种语言中,这被实现为对象、记录、结构、字典、哈希表、键控列表或关联数组。

• 有序的值列表。在大多数语言中,这被实现为数组、向量、列表或序列。

告诉我你的要求,我会更新你的 JSON,一旦你开始从 erver 获取更新的 JSON,这个问题就会得到解决。

【讨论】:

我们从 Magento's 默认 API 获得此响应,API 团队不想更改或自定义它。 你必须让他们改变,因为这个 JSON 的格式是错误的。【参考方案2】:

首先将响应存储在这样的字符串中

   String response =apiresponse;

然后在没有任何第三方的情况下尝试这种解析方法

从字符串响应中获取jsonobject

JSONObject object=new JSONObject(response);

从 json 对象中获取 jsonarray

JSONArray jsonArray=object.getJSONArray("custom_attributes");

迭代 json 数组直到它的长度

for(int i=0;i<jsonArray.length;i++)

JSONObject newobject=jsonArray.getJSONObject(i);
Boolean valueBoolean;
String valueString;
String attribute_code=newObject.getString("attribute_code");
Object value=newObject.get("value");// get **value** key data in object

现在检查 value 键的数据类型

if(value instanceof String)
valueString=value.toString(); //if value found string store in in value String 
else if(value instanceof Boolean)
valueBoolean=(Boolean)value; //if value found Boolean store it in valueBoolean



最后,由您决定,您可以简单地创建一个自定义数组列表并使用数据类型键保存所有详细信息

【讨论】:

谢谢@Umar Ata,我知道这个手动解析,但我想知道改造是否提供这个选项。 我不知道这种类型的改造解析,但我这样做了,没有任何错误 @Pankaj 如果需要接收几种类型并在回调中解析它们,那么您需要按照您在此处的建议进行操作,并且可能使用 gson 对其进行自定义以进行对象解析

以上是关于如何解析具有相同键的不同数据类型的改造对象的json数组的主要内容,如果未能解决你的问题,请参考以下文章

如何为具有不同类型键的对象编写 JSDoc?

MongoDB索引相同键的不同数据类型

具有多个选项的相同键的 django orm AND 条件

打字稿中具有通用键的对象

如何使用改造获得没有对象键的 JSON 数组

从具有不同键的嵌套对象的值创建联合