0

さて、最初のハードルはほんの数分でクリアされました。これがどのように機能するか見てみましょう。

ログに表示されているように、コードはWebサイトからJSONデータを正常にプルしていますが、JSONParserが失敗しています。問題はJSONObjectとJSONArrayの違いだと思いますが、理解できません。

ログに表示されるJSONサイトから取得したデータは次のとおりです。

09-10 09:45:00.175: I/log_tag(785): {"stoker":{"sensors":[{"id":"620000116F01CA30","name":"SS2","al":0,"ta":66,"th":75,"tl":65,"tc":66.3,"blower":null},09-10 09:45:00.175: I/log_tag(785): {"id":"E20000116F0CDB30","name":"brskt2","al":0,"ta":203,"th":32,"tl":32,"tc":70.6,"blower":null}],09-10 09:45:00.175: I/log_tag(785): "blowers":[{"id":"37000000119D8B05","name":"party","on":0}]}}

そして、これがデータを解析しようとするコードです:

            try{
            JSONArray jArray = new JSONArray(result);
            for(int i=0;i<jArray.length();i++){
                JSONObject json_data = jArray.getJSONObject(i);
                Sensor resultRow = new Sensor();
                resultRow.id = json_data.getString("id");
                resultRow.name = json_data.getString("name");
                resultRow.current = json_data.getString("tc");
                resultRow.target = json_data.getString("ta");
                arrayOfWebData.add(resultRow);
            }
        }
        catch(JSONException e){
                Log.e("log_tag", "Error parsing data "+e.toString());
        }

そして、失敗したときのログファイルのエントリは次のとおりです。

09-10 09:45:00.314: E/log_tag(785): Error parsing data org.json.JSONException: Value {"stoker":{"sensors":[{"id":"620000116F01CA30","al":0,"tl":65,"tc":66.3,"ta":66,"name":"SS2","blower":null,"th":75},{"id":"E20000116F0CDB30","al":0,"tl":32,"tc":70.6,"ta":203,"name":"brskt2","blower":null,"th":32}],"blowers":[{"id":"37000000119D8B05","on":0,"name":"party"}]}} of type org.json.JSONObject cannot be converted to JSONArray
4

2 に答える 2

3

Object または Array を指定せずに Java API を使用して JSON を解析することはできません。JSON ドキュメントはどちらでもかまいません。ログ内のデータはオブジェクトを示しているため、2 行目で JSONObject を要求する必要があります。

于 2012-09-10T15:31:28.790 に答える
1

logcat の JSON 文字列が正確である限り、2 つの変更が必要です。まず、結果は JSONArray を含む JSONObject です。最初にオブジェクトを作成し、そのオブジェクトから配列を抽出する必要があります。2 番目に、tc と ta は出力でそれぞれ double と integer として表示されるため、そのように取得する必要があります。それはすべて次のようになります。

    try {
        JSONObject obj = new JSONObject(result);
        JSONObject stoker = obj.getJSONObject("stoker");
        JSONArray jArray = stoker.getJSONArray("sensors");
        for(int i = 0; i < jArray.length(); i++) {
            JSONObject json_data = jArray.getJSONObject(i);
            Sensor resultRow = new Sensor();
            resultRow.id = json_data.getString("id");
            resultRow.name = json_data.getString("name");
            resultRow.current = json_data.getDouble("tc");
            resultRow.target = json_data.getInt("ta");
            arrayOfWebData.add(resultRow);
        }
    }
    catch(JSONException e){
        Log.e("log_tag", "Error parsing data "+e.toString());
    }

提供された JSON 文字列に基づいて、これは機能するはずです。今後の参考のために、{} 内に含まれるものはすべて JSONObject であり、[] 内に含まれるものはすべて JSONArray です。引用符で囲まれているキーと値のペアの 2 番目の値は文字列である可能性が高く、引用符のない値は数値として取得されます。

于 2012-09-10T15:45:55.177 に答える