2013-07-28 107 views
0

我正在解析從Mongo DB中提取的JSONObject。根據文檔,數字值映射到java.lang.number對象。但是,當我嘗試進行以下聲明時,特別是在第一個System.out.println(value.floatVlaue())中時,出現錯誤。解析JSONObject,但運行到NullPointer異常

//For data 
    int counter = 0; 
    float score = 0; 
    Number value = 0; 

    while(cur.hasNext()){ 
     JSONObject jsonObj = (JSONObject) JSONValue.parse(cur.next().toString()); 
     metricsIterator = ((JSONObject)((JSONObject)((JSONObject)((JSONObject)jsonObj.get("level_1")).get("level_2")).get("level_3")).get("metrics")).keySet().iterator(); 

     while(metricsIterator.hasNext()){ 
      System.out.println(metricsIterator.next().toString()); 
      value = (Number) jsonObj.get(metricsIterator.next()); 

      System.out.println(value.floatValue()); 

      System.out.println(value.toString()); 

      someLogic(value.doubleValue(), ((Number)jsonObj.get("long")).intValue(), start, end, days); 
     } 
    } 

我覺得問題肯定行來自value = (Number) jsonObj.get(metrics Iterator.next())

JSON的IM解析看起來像這樣

{ "_id" : "9223370663181869423_cnn_1" , 
    "long" : 1373672925000 , 
    "level_1" : 
      { "level_2" : 
       { "level_3level" : 
        { "metrics" : 
          {"key1" : 0.003333333333333334 , 
          "key2" : 0.005833333333333334 , 
          "key3" : 0.005833333333333334 , 
          "key4" : 0.009166666666666667 , 
          "key5" : 0.1391666666666667 , 
          "key6" : 0.1241666666666667 , 
          "key7" : 0.01666666666666667 
          } 
        } 
       } 
      } 
    } 

感謝這麼多的幫助了!

回答

1

迭代器只能遍歷一次。這意味着,一旦您在System.out.println(metricsIterator.next().toString());中執行metricsIterator.next(),您最終將使用該值,並且在value = (Number) jsonObj.get(metricsIterator.next());中再次呼叫.next()時,您將獲得預期值之後的值,換句話說,您將跳過一個值。 因此,當您點擊最後一個值時,下一個值爲空,結果爲空指針。 嘗試在賦值之前移除sysout,它應該解決空指針。

0

你正在做兩次metricsIterator.next()

第一內容:System.out.println(metricsIterator.next()的toString()); second:value =(Number)jsonObj.get(metricsIterator.next());

然後你到底沒有檢查是否hasNext()