使用json值中的数组和字符串在Java中解析大型json数据
从媒体服务器生成的json字符串如下所示使用json值中的数组和字符串在Java中解析大型json数据,java,android,json,parsing,large-data,Java,Android,Json,Parsing,Large Data,从媒体服务器生成的json字符串如下所示 { "id": 1, "jsonrpc": "2.0", "result": { "albums": [ { "albumid": 1, "albumlabel": "", "artist": [ "www.SongsLover.pk"
{
"id": 1,
"jsonrpc": "2.0",
"result": {
"albums": [
{
"albumid": 1,
"albumlabel": "",
"artist": [
"www.SongsLover.pk"
],
"artistid": [
2
],
"description": "",
"genre": [
"Pop"
],
"label": "Single 2012",
"rating": 0,
"style": [
""
],
"thumbnail": "image://music@smb%3a%2f%2fCECOTS-NAS%2fMedia%2fMusic%2fbackup%20Music%2fSissle2%2fGangnam%20Style%20.mp3/",
"title": "Single 2012",
"type": "",
"year": 0
},
{
"albumid": 164,
"albumlabel": "",
"artist": [
"ARrahman","MJ"
],
"artistid": [
146,163
],
"description": "",
"genre": [
"Soundtrack"
],
"label": "Lord of the rings",
"rating": 0,
"style": [
""
],
"thumbnail": "image://music@smb%3a%2f%2fCECOTS-NAS%2fMedia%2fMusic%2fExtras_Test%2fEnakkena%20Yenave.mp3/",
"title": "Lord of the rings",
"type": "",
"year": 2000
},{..........},{........},{........}
],
"limits": {
"end": 155,
"start": 0,
"total": 155
}
}
}
下面是我尝试使用Java的代码。Iam以输入流的形式获取json响应,并使用jsonreader解析json响应。但是在上面的json中,artist字典具有没有名称的数组值
JsonReader reader = new JsonReader(new InputStreamReader(inputStream,
"UTF-8"));
ArrayList<Integer> albumId = new ArrayList<Integer>();
ArrayList<String> artistId = new ArrayList<String>();
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equalsIgnoreCase("result")) {
reader.beginObject();
while (reader.hasNext()) {
String check = reader.nextName();
if (check.equalsIgnoreCase(type)) {
reader.beginArray();
int i = 0;
while (reader.hasNext()) {
i++;
reader.beginObject();
int albumid;
String artistid = null;
while (reader.hasNext()) {
name = reader.nextName();
if (name.equalsIgnoreCase("albumid")) {
albumid = reader.nextInt();
albumId.add(albumid);
} else if (name
.equalsIgnoreCase("artist")) {
reader.beginArray();
while(reader.hasNext()){
artistid = reader.nextString();
artistId.add(artistid);
}
reader.endArray();
} else {
reader.skipValue();
}
}
reader.endObject();
//}
}
Log.i(LOGCAT, Integer.toString(i));
reader.endArray();
} else {
reader.skipValue();
}
}
reader.endObject();
} else {
reader.skipValue();
}
}
reader.endObject();
JsonReader reader=新的JsonReader(新的InputStreamReader(inputStream,
“UTF-8”);
ArrayList albumId=新的ArrayList();
ArrayList artistId=新的ArrayList();
while(reader.hasNext()){
字符串名称=reader.nextName();
if(name.equalsIgnoreCase(“结果”)){
reader.beginObject();
while(reader.hasNext()){
字符串检查=reader.nextName();
if(检查相等信号情况(类型)){
reader.beginArray();
int i=0;
while(reader.hasNext()){
i++;
reader.beginObject();
int-albumid;
字符串artistid=null;
while(reader.hasNext()){
name=reader.nextName();
if(name.equalsIgnoreCase(“albumid”)){
albumid=reader.nextInt();
添加(albumId);
}如果(姓名)
.equalsIgnoreCase(“艺术家”)){
reader.beginArray();
while(reader.hasNext()){
artistid=reader.nextString();
artistId.添加(artistId);
}
reader.endArray();
}否则{
reader.skipValue();
}
}
reader.endObject();
//}
}
Log.i(LOGCAT,Integer.toString(i));
reader.endArray();
}否则{
reader.skipValue();
}
}
reader.endObject();
}否则{
reader.skipValue();
}
}
reader.endObject();
因此,我面临的问题是如何使用上述代码从artist字典中获取数组值。请帮我做这件事。提前谢谢。//试试这个方法,希望这能帮你解决问题。。。
// Try this way,hope this will you to solve your problem...
String respone = "{\"id\":1,\"jsonrpc\":\"2.0\",\"result\":{\"albums\":[{\"albumid\":1,\"albumlabel\":\"\",\"artist\":[\"www.SongsLover.pk\"],\"artistid\":[2],\"description\":\"\",\"genre\":[\"Pop\"],\"label\":\"Single 2012\",\"rating\":0,\"style\":[\"\"],\"thumbnail\":\"image://music@smb%3a%2f%2fCECOTS-NAS%2fMedia%2fMusic%2fbackup%20Music%2fSissle2%2fGangnam%20Style%20.mp3/\",\"title\":\"Single 2012\",\"type\":\"\",\"year\":0},{\"albumid\":164,\"albumlabel\":\"\",\"artist\":[\"ARrahman\",\"MJ\"],\"artistid\":[146,163],\"description\":\"\",\"genre\":[\"Soundtrack\"],\"label\":\"Lord of the rings\",\"rating\":0,\"style\":[\"\"],\"thumbnail\":\"image://music@smb%3a%2f%2fCECOTS-NAS%2fMedia%2fMusic%2fExtras_Test%2fEnakkena%20Yenave.mp3/\",\"title\":\"Lord of the rings\",\"type\":\"\",\"year\":2000}],\"limits\":{\"end\":155,\"start\":0,\"total\":155}}}";
ArrayList<HashMap<String,Object>> albumList = new ArrayList<HashMap<String, Object>>();
try{
JSONObject responseJson = new JSONObject(respone);
JSONArray albumJsonArray = responseJson.getJSONObject("result").getJSONArray("albums");
for (int i=0;i<albumJsonArray.length();i++){
HashMap<String,Object> album = new HashMap<String, Object>();
album.put("albumid",albumJsonArray.getJSONObject(i).getString("albumid"));
album.put("albumlabel",albumJsonArray.getJSONObject(i).getString("albumlabel"));
JSONArray artistJsonArray = new JSONArray(albumJsonArray.getJSONObject(i).getString("artist"));
ArrayList<String> artistList = new ArrayList<String>();
for (int j=0;j<artistJsonArray.length();j++){
artistList.add(artistJsonArray.getString(j));
}
album.put("artist",artistList);
JSONArray artistidJsonArray = new JSONArray(albumJsonArray.getJSONObject(i).getString("artistid"));
ArrayList<String> artistidList = new ArrayList<String>();
for (int j=0;j<artistidJsonArray.length();j++){
artistidList.add(artistidJsonArray.getString(j));
}
album.put("artistid",artistidList);
album.put("description",albumJsonArray.getJSONObject(i).getString("description"));
JSONArray genreJsonArray = new JSONArray(albumJsonArray.getJSONObject(i).getString("genre"));
ArrayList<String> genreList = new ArrayList<String>();
for (int j=0;j<genreJsonArray.length();j++){
genreList.add(genreJsonArray.getString(j));
}
album.put("genre",genreList);
album.put("label",albumJsonArray.getJSONObject(i).getString("label"));
album.put("rating",albumJsonArray.getJSONObject(i).getString("rating"));
JSONArray styleJsonArray = new JSONArray(albumJsonArray.getJSONObject(i).getString("style"));
ArrayList<String> styleList = new ArrayList<String>();
for (int j=0;j<styleJsonArray.length();j++){
styleList.add(styleJsonArray.getString(j));
}
album.put("style",styleList);
album.put("thumbnail",albumJsonArray.getJSONObject(i).getString("thumbnail"));
album.put("title",albumJsonArray.getJSONObject(i).getString("title"));
album.put("type",albumJsonArray.getJSONObject(i).getString("type"));
album.put("year",albumJsonArray.getJSONObject(i).getString("year"));
albumList.add(album);
}
for (HashMap<String,Object> album:albumList){
System.out.println("Album Id : "+album.get("albumid").toString());
System.out.println("Album Label : "+album.get("albumlabel").toString());
System.out.println("Album Description : "+album.get("description").toString());
System.out.println("Label : "+album.get("label").toString());
System.out.println("Rating : "+album.get("rating").toString());
System.out.println("Thumbnail : "+album.get("thumbnail").toString());
System.out.println("Title : "+album.get("title").toString());
System.out.println("Type : "+album.get("type").toString());
System.out.println("Year : "+album.get("year").toString());
System.out.println("Artist size : "+((ArrayList<String>)album.get("artist")).size());
System.out.println("Artist Id size : "+((ArrayList<String>)album.get("artistid")).size());
System.out.println("Genre size : "+((ArrayList<String>)album.get("genre")).size());
System.out.println("Style size : "+((ArrayList<String>)album.get("style")).size());
}
}catch (Throwable e){
e.printStackTrace();
}
String respone=“{\'id\'”:1、\'jsonrpc\':\'2.0\'、\'result\':{\'albums\':[{\'albumid\':1、\'albumlabel\':\'”、\'artistid\':[2]、\'description\':“\”、\'流派\':[\'Pop\'”、'label\':“Single thumbnail\','2012年单缩略图”、'rating\'0、\'style\':[\,'image://music@3.mp3/“,,,,“标题:,,,,“标题:,,,,,,“标题:,,,,,,,,“标题:样式\“:[\“\”],\“缩略图\”:”image://music@smb%3a%2f%2fcocts NAS%2fMedia%2fMusic%2fExtras\u Test%2fEnakkena%20Yenave.mp3/\,“title\:“指环王”,“type\”:“type\”,“year\”:2000},“limits\”:{“end\”:155、“start\”:0、“total\”:155};
ArrayList albumList=新建ArrayList();
试一试{
JSONObject responseJson=新JSONObject(respone);
JSONArray albumJsonArray=responseJson.getJSONObject(“结果”).getJSONArray(“相册”);
对于(inti=0;i,可以使用JsonPath提取艺术家数组
e、 g.“$.result.albums[*].artist”
如果您正在处理大型json,这将是一个很好的选择,因为它使用流式解析器,而无需将整个json加载到内存中
代码使用JsonSurfer很短
JsonSurfer jsonSurfer = JsonSurfer.gson();
Collection<Object> result = jsonSurfer.collectAll(inputStreamReader, "$.result.albums[*].artist");
JsonSurfer-JsonSurfer=JsonSurfer.gson();
Collection result=jsonSurfer.collectAll(inputStreamReader,“$.result.albums[*].artist”);
使用一个像样的JSON库(例如Jackson或Gson)创建POJO;反序列化到这些POJO directlyOk fge,我会跟进。有没有办法用上述代码实现输出?