2016-05-10 11 views
-1
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がどのように見えるかあるのJSON配列として正しく構成されていないJSONデータを与えた私は、解析しようとしています:教授の研究学生は、ユーザー

{ 
users: { 
276c7438-2b6a-4d92-a5f8-4a9e9007efa8: { 
email: "[email protected]", 
username: "power nit" 
}, 

de977b2f-2243-425c-9dfe-9f1443e41303: { 
email: "[email protected]", 
username: "Denver vronkos" 
}, 
e73cd6c9-9577-4cdc-b8fe-4227ac227c6b: { 
email: "[email protected]", 
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; 
    } 

} 

}

私はそれをデバッグしようとしています。イテレータがヌルまたは訪問先ノードに存在しない値をヒットすると、条件をチェックしてもコードがNoSuchElementExceptionをスローしますが、コードはこのエラーをスローします。

私はインターネットで検索しましたが、私がすでに行っているjson.has(key)とjson.isNull(key)であることがわかりました。この問題はどのように解決できますか?

ご協力いただきありがとうございます。

+0

なぜGSonを使用しないのですか? – toha

+0

Jsonの解析にGsonまたはJacksonライブラリを使用します。レスポンスのためにpojoクラスを作成するだけで、ライブラリがすべてあなたのために管理します。 – androidnoobdev

+0

あなたのjsonは間違っています。 JSonLintは、それがエラーのエラーを持っていることを言った: {\tユーザー:1行目にエラーを解析して '未定義' しまった、{\t \t 276 c743 ----^ は、 'STRING' を期待 '}' – toha

答えて

1

前述のとおり、JSONは無効です。双方は引用符で囲む必要があり、あなたは[]内の情報の配列を配置する必要があります。たとえば

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

どのアレイですか? 'users'はUUIDでキーされたユーザオブジェクトを持つ" map "オブジェクトです。 – Andreas

+0

これは私のJSONではありません。これは私の教授の研究学生が私に与えたものです。彼はそれに取り組んだ。私はそれを解析し、sourseを変更することはできません:( – powernit

+0

@Andreas:ああ、私は参照してください。 – toha

1

あなたは次のオブジェクトを取得したいたび、あなたは()

を呼び出すたび
i.next(); 

i.nextを呼び出します。イテレータは次の位置に移動し、オブジェクトを返します。 i.next();を割り当てる必要があります。と仲介変数

0

ガイズエラーがi.next().toString()!=null条件によって引き起こされました。それを私のコードから削除し、i.hasNext()のチェックだけを行い、セットをループする前に、Set.remove(null)を使ってすべてのヌル値を削除しました。私の場合はpKeys.remove(null)userKeys.remove(null)です。

ありがとうございました!

関連する問題