从String到JSONObject的JSON-simple ClassCastException

时间:2013-06-17 18:12:35

标签: java json json-simple

我有一个像这样的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。为什么我会收到此错误。

感谢。

3 个答案:

答案 0 :(得分:2)

“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数组(就像您为每条消息所做的那样)。

答案 1 :(得分:0)

json内容中嵌入了json内容。 “外部”对象的键"message"带有单字符串值。该字符串值恰好是序列化的json,但json解析器不会自动为您处理。您将必须获取消息值并再次解析该消息。 (实际上,它比这更糟糕,你至少有2级嵌入的json内容)。

答案 2 :(得分:-1)

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
}