如何使用Retrofit 2解析具有动态密钥的json数组

时间:2017-08-07 07:00:54

标签: android json retrofit2

我正在尝试使用改造2来获取json响应。我的json响应看起来像这样:

[
    0 : {
        type : "video",
        format : "mp4",
        size : "10mb"
        },
    1 : {
        type : "audio",
        format : "mp3",
        size : "10mb"
        },
    2 : {
        type : "text",
        format : "pdf",
        size : "10mb"
        }
]

我的模特课怎么样?我无法理解,因为它有动态密钥。

3 个答案:

答案 0 :(得分:5)

这不是一个有效的Json,因为你可以在https://jsonlint.com/上尝试,你可以将你的回复更改为:

<router-outlet>

答案 1 :(得分:3)

首先,这是无效/不完整的JSON。有效版本看起来像这样

{
  "items": [
    {
      "0": {
        "type": "video",
        "format": "mp4",
        "size": "10mb"
      }
    },
    {
      "1": {
        "type": "audio",
        "format": "mp3",
        "size": "10mb"
      }
    },
    {
      "2": {
        "type": "text",
        "format": "pdf",
        "size": "10mb"
      }
    }
  ]
}

它可以安全地反序列化到这个

    class Item{
        String type;
        String format;
        String size;
    }

    class Response{
        List<Map<Integer,Item>> items;
    }


//....

Response response = new Gson().fromJson(yourJson, Response.class);

作为替代解决方案,我确信您无法更改JSON格式,请将JSON字符串中的[]更改为{}并将其反序列化为

Map fieldMap = (Map)new Gson().fromJson(json, Map.class);

它应该为您提供所有数据的LinkedTreeMap

答案 2 :(得分:2)

所以,正如人们已经说过的,如果你改变你的json是有效的:

[  
   {  
      "type":"video",
      "format":"mp4",
      "size":"10mb"
   },
   {  
      "type":"audio",
      "format":"mp3",
      "size":"10mb"
   },
   {  
      "type":"text",
      "format":"pdf",
      "size":"10mb"
   }
]

然后你可以创建你的类,例如:

public class Test {
    public String type;
    public String format;
    public String size;
}

然后,与Gson:

Type testType = new TypeToken<ArrayList<Test>>(){}.getType();
ArrayList<Test> list = new Gson().fromJson(json, testType);

另一方面,通过retrofit2,您可以让https://dcos.io/docs/1.9/administering-clusters/update-a-node/为您完成工作。