1

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

谢谢。

4

3 回答 3

2

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

于 2013-06-17T18:46:29.253 回答
0

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

于 2013-06-17T18:22:27.073 回答
-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
}
于 2013-08-21T09:19:08.353 回答