使用json值中的数组和字符串在Java中解析大型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"

从媒体服务器生成的json字符串如下所示

{
    "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,我会跟进。有没有办法用上述代码实现输出?