繁体   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