教授的研究生提供的 JSON 数据结构不正确,是 JSON 用户数组

professor's research student gave JSON data which is not structured correctly as a JSON array of users

Exception in thread "main" java.util.NoSuchElementException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1431)
at java.util.HashMap$KeyIterator.next(HashMap.java:1453)
at DataParse.parseFeed(DataParse.java:61)
at intellidealsbackend.main(intellibackend.java:25)

这是我尝试解析的 JSONObject 的外观:

  {
users: {
276c7438-2b6a-4d92-a5f8-4a9e9007efa8: {
email: "power.nit@gmail.com",
username: "power nit"
},

de977b2f-2243-425c-9dfe-9f1443e41303: {
email: "denvervronkos@gmail.com",
username: "Denver vronkos"
},
e73cd6c9-9577-4cdc-b8fe-4227ac227c6b: {
email: "ls@gmail.com",
username: "laveena sharma"
}
},
visited: {
2fe51b4a-60b9-42cf-a889-bb607a5ea9bd: {
-KGWYAYM_iW6vi_SGBq3: {
condition: "clear sky",
date: "29 Apr 2016",
degree: "59.90360000000002",
latitude: "33.7932608",
longitude: "-118.1359034",
placeType: "Shopping Mall",
placeVisited: "Los Altos Mall",
time: "03:24",
uid: "3b0b90ce-8d13-4c7b-ab5b-b453aa9fabc5",
username: "kunal bolia"
},
-KGWYK9wH7UPcXMNCisY: {
condition: "clear sky",
date: "29 Apr 2016",
degree: "59.90360000000002",
latitude: "33.79330768",
longitude: "-118.13585834",
placeType: "Shopping Mall",
placeVisited: "Los Altos Mall",
time: "03:25",
uid: "3b0b90ce-8d13-4c7b-ab5b-b453aa9fabc5",
username: "kunal bolia"
}
},
68ebe7a6-7344-4d50-b647-16bb830ad413: {
-KGWB4NOqJGg6DNSPN1n: {
condition: "clear sky",
date: "29 Apr 2016",
degree: "59.90360000000002",
latitude: "33.7932834",
longitude: "-118.135812",
placeType: "Shopping Mall",
placeVisited: "Los Altos Mall",
time: "01:43",
uid: "68ebe7a6-7344-4d50-b647-16bb830ad413",
username: "bat man"
},
-KGWBIvlt9pUQOrJgK0p: {
condition: "clear sky",
date: "29 Apr 2016",
degree: "59.90360000000002",
latitude: "33.79357387",
longitude: "-118.13580848",
placeType: "Shopping Mall",
placeVisited: "Los Altos Mall",
time: "01:44",
uid: "68ebe7a6-7344-4d50-b647-16bb830ad413",
username: "bat man"
},
-KGWQi36kjznhtMerapt: {
condition: "clear sky",
date: "29 Apr 2016",
degree: "59.90360000000002",
latitude: "33.7932608",
longitude: "-118.1359034",
placeType: "Shopping Mall",
placeVisited: "Los Altos Mall",
time: "02:52",
uid: "68ebe7a6-7344-4d50-b647-16bb830ad413",
username: "bat man"
}
} 

这是我对解析器的实现:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class DataParse {


private static List<String> uids;


public static List<DataModal> parseFeed(String content) {
    try {

            List<DataModal> dataList = new ArrayList<>();
            uids = new ArrayList<>();

            //get root node
            JSONObject data = new JSONObject(content);
            if(data.has("users")&& data.has("visited")&& !data.isNull("users")&& !data.isNull("visited")){
                // We get parent nodes
                JSONObject userObj = data.getJSONObject("users");
                JSONObject visitedObj = data.getJSONObject("visited");

                //get map from JSON object for its keys
                JSONToMap jtm = new JSONToMap();
                Map<String,Object> userId =  jtm.jsonToMap(userObj);

                //these are the keys from all the users
                Set<String> userKeys = userId.keySet();

                uids.addAll(userKeys);

                for(Iterator i = userKeys.iterator();i.hasNext();){

                    //boolean test = visitedObj.isNull(i.next().toString());

                    if(visitedObj.isNull(i.next().toString())||!visitedObj.has(i.next().toString())){

                        continue;
                    }                   
                    else{

                        JSONObject visitedDatauid = visitedObj.getJSONObject(i.next().toString());
                        //get map from JSON object for its keys

                        JSONToMap jtmPushKeys = new JSONToMap();
                        Map<String,Object> pushKeys =  jtmPushKeys.jsonToMap(visitedDatauid);
                        Set<String> pKeys = pushKeys.keySet();
                        //iterate through uid -> unique keys from push in android
                            for(Iterator j = pKeys.iterator();j.hasNext();)
                            {

                                //access push key 'j' data for particular uid 'i'
                                if(!(visitedDatauid.isNull(j.next().toString()))&& (visitedDatauid.has(j.next().toString()))){

                                    JSONObject visitdata = visitedDatauid.getJSONObject(j.next().toString());

                                    //String uidIter = i.next().toString(); 


                                            //JSONObject user = userObj.getJSONObject(i.next().toString());

                                            //Get data from JSONObjects and store in Strings
                                            String uid="",username="",email="",placevisited="",lat="",lon="", condition ="";

                                            //String uid="",username="",email="",placevisited="",lat="",lon="", condition ="";

                                            uid = visitdata.getString("uid");
                                            username = visitdata.getString("username");
                                            //email = user.getString("email");
                                            placevisited = visitdata.getString("placeVisited");
                                            lat = visitdata.getString("latitude");
                                            lon = visitdata.getString("longitude");
                                            condition = visitdata.getString("condition");

                                            //DataModal dm = new DataModal(email,uid,username,lat,lon,placevisited,condition);
                                            DataModal dm = new DataModal(uid,username,lat,lon,placevisited,condition);
                                            dataList.add(dm);

                                        }

                                    else{

                                        System.err.println("Visited key:"+j.next().toString()+" do not exist in Visited");

                                        String uid="",username="",email="",placevisited="",lat="",lon="", condition ="";

                                        //String uid="",username="",email="",placevisited="",lat="",lon="", condition ="";

                                        uid = i.next().toString();
                                        username = "NA";
                                        email = "NA";
                                        placevisited = "NA";
                                        lat = "NA";
                                        lon = "NA";
                                        condition = "NA";

                                        DataModal dm = new DataModal(uid,username,lat,lon,placevisited,condition);
                                        dataList.add(dm);
                                        continue;
                                    }

                                }

                            }
                        }               
                }


            return dataList;
    } catch (JSONException e) {
        e.printStackTrace();
        return null;
    }

}

}

我一直在尝试调试它。当迭代器遇到 null 或访问节点中不存在的值时,它会抛出 NoSuchElementException,即使我已检查条件代码仍然抛出此错误。

我在网上搜索过,只找到 json.has(key) 和 json.isNull(key) 的检查,我已经 performing.How 了,我能解决这个问题吗?

谢谢 非常感谢你的帮助。

每次你想得到你调用的下一个对象时

 i.next();

每当你调用 i.next(); 你的迭代器将移动到下一个位置并且 return 给你对象。 所以你应该将 i.next(); 分配给中间变量

如前所述,您的 JSON 无效。两边都需要用引号引起来,你需要把信息数组放在 []:

例如:

{
"users": [{
    "276c7438-2b6a-4d92-a5f8-4a9e9007efa8": {
        "email": "power.nit@gmail.com",
        "username": "power nit"
    },
    "de977b2f-2243-425c-9dfe-9f1443e41303": {
        "email": "denvervronkos@gmail.com",
        "username": "Denver vronkos"
    },
    "e73cd6c9-9577-4cdc-b8fe-4227ac227c6b": {
        "email": "ls@gmail.com",
        "username": "laveena sharma"
    }
}]
}

伙计们,错误是由 i.next().toString()!=null 条件引起的。从我的代码中删除它并仅检查 i.hasNext() 是否有效,并且在循环遍历集合之前我使用 Set.remove(null) 删除了所有空值所以在我的例子中,pKeys.remove(null)userKeys.remove(null) .

感谢您的帮助!