2017-08-07 28 views
0

我想使用改装2.我的JSON响应看起来像这样获取JSON响应其动态密钥JSON数组:如何分析利用改造2

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

应该如何我的模型类是什么样子?我无法理解,因为它具有动态密钥。

+0

你用什么库来解析? GSON?杰克逊?无论如何,这是一个数组,因此将它解析为一个类(具有类型,格式和大小)的数组应该是直截了当的。 –

+0

我正在使用gson –

+0

,因为他们已经说过,json是无效的,一旦有效,你就不应该有任何问题来解析它。我附上一个例子 –

回答

5

这不是一个有效的JSON,你可以尝试在https://jsonlint.com/,你可以改变你的回应:

[ 
    { 
     "type":"video", 
     "format":"mp4", 
     "size":"10mb" 
    }, 
    { 
     "type":"audio", 
     "format":"mp3", 
     "size":"10mb" 
    }, 
    { 
     "type":"text", 
     "format":"pdf", 
     "size":"10mb" 
    } 
] 
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

+0

为什么要列出地图?,json应该更简单,就像@Arash提供的那样。响应应该是一个项目清单。 –

+0

我不确定0:{something}在GSON中像list.add(0,something)一样工作。 “:” 通常意味着键/值。 [“1”,“2”,“3”]:这肯定会反序列化成一个有效的java列表。 – Nick

+0

但是,如果您要更改json以使其有效,您可以更改... –

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你可以得到Gson converter为你做这项工作。