簡體   English   中英

JSON簡單的ClassCastException,從String到JSONObject

[英]JSON-simple ClassCastException from String to JSONObject

我有這樣的JSON對象數組:

{"message":"[\"{\\\"name\\\":\\\"lays\\\",\\\"calories\\\":1.0}\",\"{\\\"name\\\":\\\"lays\\\",\\\"calories\\\":0.33248466}\"]"}

我正在嘗試使用以下代碼來解析它:

Object object = parser.parse ( message );
JSONArray array = (JSONArray) object;
for(int i=0;i < array.size () ; i++)
{
    System.out.println(array.get ( i ));//output; {"name":"lays","calories":1.0}
    JSONObject jsonObj = ( JSONObject ) array.get ( i );//ClassCastExceptio
    String foodName = ( String ) jsonObj.get ( KEY_NAME );
    Float calories = (Float) jsonObj.get ( KEY_CARLORIES );
    Nutrinfo info = new Nutrinfo(foodName,calories);
    data.add ( info );

}

但我在標記的行上收到ClassCastException。 這沒有道理:array.get()返回一個對象,我將其強制轉換為JSONObject。 為什么我會收到此錯誤。

謝謝。

您在“ message” json對象內有多個json對象。 使用此代碼檢索第一個值(所有它們都需要循環)。 似乎您可能想重新排列創建json對象的方式。

Object object = parser.parse ( message );
JSONArray array = (JSONArray) object;
for(int i=0;i < array.size () ; i++)
{
JSONArray jsonArray = ( JSONArray ) array.get ( i );
JSONObject jsonObj = (JSONObject) jsonArray.get(0);
String foodName = jsonObj.getString ( KEY_NAME );
Float calories = jsonObj.getFloat ( KEY_CARLORIES );
Nutrinfo info = new Nutrinfo(foodName,calories);
data.add ( info );
}

請記住,使用JSON時,每套{}括號都表示一個單獨的JSON對象。 在同一級別上處理多個對象時,必須首先獲取JSON數組(就像對每條消息所做的一樣)。

您將json內容嵌入json內容中。 “外部”對象具有帶有單個字符串值的鍵"message" 該字符串值恰好是序列化的json,但json解析器不會自動為您處理。 您將必須獲取消息值並再次進行解析。 (實際上,更糟糕的是,您至少有2個級別的嵌入式json內容)。

Object object = parser.parse ( message );

if( object instanceof JSONObject ){
    // TODO : process with single JSON Object
}
else if( object instanceof JSONArray ){
    // TODO : process with JSONArray Object
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM