Java 教授';s的研究生给出了JSON数据,该数据的结构不正确,无法作为用户的JSON数组
下面是我试图解析的JSONObject的外观:Java 教授';s的研究生给出了JSON数据,该数据的结构不正确,无法作为用户的JSON数组,java,android,json,getjson,Java,Android,Json,Getjson,下面是我试图解析的JSONObject的外观: 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 in
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)
这是我对解析器的实现:
{
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;
导入java.util.Iterator;
导入java.util.List;
导入java.util.Map;
导入java.util.Set;
导入org.json.JSONArray;
导入org.json.JSONException;
导入org.json.JSONObject;
公共类数据解析{
私有静态列表UID;
公共静态列表源(字符串内容){
试一试{
List dataList=new ArrayList();
uids=新的ArrayList();
//获取根节点
JSONObject数据=新的JSONObject(内容);
if(data.has(“用户”)&&data.has(“已访问”)&&&!data.isNull(“用户”)&&&!data.isNull(“已访问”)){
//我们得到父节点
JSONObject userObj=data.getJSONObject(“用户”);
JSONObject visitedObj=data.getJSONObject(“已访问”);
//从JSON对象获取其键的映射
JSONToMap jtm=新的JSONToMap();
Map userId=jtm.jsonToMap(userObj);
//这些是来自所有用户的密钥
Set userKeys=userId.keySet();
uids.addAll(用户密钥);
for(迭代器i=userKeys.Iterator();i.hasNext();){
//布尔测试=visitedObj.isNull(i.next().toString());
如果(visitedObj.isNull(i.next().toString())| |!visitedObj.has(i.next().toString())){
继续;
}
否则{
JSONObject visitedDatauid=visitedObj.getJSONObject(i.next().toString());
//从JSON对象获取其键的映射
JSONToMap jtmPushKeys=新的JSONToMap();
Map pushKeys=jtmPushKeys.jsonToMap(visitedDatauid);
Set pKeys=pushKeys.keySet();
//在推入式android中迭代uid->唯一键
for(迭代器j=pKeys.Iterator();j.hasNext();)
{
//访问特定uid“i”的按键“j”数据
如果(!(visitedDatauid.isNull(j.next().toString())&(visitedDatauid.has(j.next().toString())){
JSONObject visitdata=visitedDatauid.getJSONObject(j.next().toString());
//字符串uidIter=i.next().toString();
//JSONObject user=userObj.getJSONObject(i.next().toString());
//从JSONObject获取数据并以字符串形式存储
字符串uid=“”,username=“”,email=“”,placevisted=“”,lat=“”,lon=“”,condition=“”;
//字符串uid=“”,username=“”,email=“”,placevisted=“”,lat=“”,lon=“”,condition=“”;
uid=visitdata.getString(“uid”);
username=visitdata.getString(“用户名”);
//email=user.getString(“电子邮件”);
placevisited=visitdata.getString(“placevisited”);
lat=visitdata.getString(“纬度”);
lon=visitdata.getString(“经度”);
condition=visitdata.getString(“condition”);
//DataModal dm=新的DataModal(电子邮件、uid、用户名、lat、lon、访问地点、条件);
DataModal dm=新的DataModal(uid、用户名、lat、lon、访问地点、条件);
dataList.add(dm);
}
否则{
System.err.println(“已访问键:+j.next().toString()+”在已访问中不存在”);
字符串uid=“”,username=“”,email=“”,placevisted=“”,lat=“”,lon=“”,condition=“”;
//字符串uid=“”,username=“”,email=“”,placevisted=“”,lat=“”,lon=“”,condition=“”;
uid=i.next().toString();
username=“NA”;
电子邮件=“NA”;
“NA”;
lat=“NA”;
lon=“NA”;
条件=“NA”;
DataModal dm=新的DataModal(uid、用户名、lat、lon、访问地点、条件);
dataList.add(dm);
继续;
}
}
}
}
}
返回数据列表;
}捕获(JSONException e){
e、 printStackTrace();
返回null;
}
}
}
我一直在试着调试它。当迭代器命中null或访问节点中不存在的值时,它会抛出NoTouchElementException,即使我有检查条件,代码仍会抛出此错误
我在互联网上搜索过,只找到了json.has(key)和json.isNull(key)的检查,我已经在执行了。我如何解决这个问题
谢谢,我真的很感谢你的帮助。每次你想得到下一个你呼叫的对象时
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;
}
}
无论何时调用i.next()迭代器将移动到下一个位置并将对象返回给您。
因此,您应该指定i.next()调停
i.next();
{
"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"
}
}]
}