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 に答える