4

phpスクリプトからAndroidアプリにJSONデータを送信しようとしていますが、phpスクリプトの出力がJavaアプリの期待とは異なります。

$data['sample']['txt']="hello world";
echo json_encode($data) // {"sample":{"txt":"hello world"}}
//above is incorrect, need {sample : [{txt:"hello world"}]}

形式が正しくないと、次のJava例外が発生します。

org.json.JSONException: Value {"txt":"hello world"} at sample of type org.json.JSONObject cannot be converted to JSONArray.  

私が見逃しているPHPのjson_encodeの引数、またはそれを適切にエンコードする代替案はありますか?

非同期タスクのJavaコード:

public class RetrieveData extends AsyncTask<List<? extends NameValuePair>, Integer, List<String>> {

    protected List<String> doInBackground(List<? extends NameValuePair>... postData) {
        InputStream is = null;
        List<String> result = new ArrayList<String>();

        try {
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://192.168.72.2:10088/droid_test/test.php");
            httppost.setEntity(new UrlEncodedFormEntity(postData[0]));
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();

            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
            }
            reader.close();
            is.close();

            JSONObject JSONobj=new JSONObject(sb.toString());
            JSONArray JSONarr=JSONobj.getJSONArray("sample");

            for(int i = 0 ; i < JSONarr.length() ; i++){
                result.add(JSONarr.getJSONObject(i).getString("txt"));
            }

            }
        catch(Exception e) {
            result.add("ERROR "+e.toString());
        }

        return result;
    }

    protected void onPostExecute(List<String> result) {
            getHTTP(result);
    }

}

getHTTP(result)は、値をTextViewに設定するだけで、エラーが表示されます。(またはechoステートメントをハードコーディングした場合の応答)

解決:

JSONObject JSONobj=new JSONObject(sb.toString());
JSONObject JSONarr=JSONobj.getJSONObject("sample"); // made object per @digitaljoel's suggestion

for(int i=0; i<JSONarr.length(); i++) {
    result.add(JSONarr.getString("txt")); // getting a String, not another array/object *duh*
}
4

2 に答える 2

4

表示するJSONの例はどちらも有効なJSONであり、両端のマッピングが何であるかが問題になります。

Javaコードは、「サンプル」にオブジェクトのコレクション(リストまたは配列)が含まれていることを想定しています。各オブジェクトにはtxtフィールドがあります。そのため、JSONのオブジェクト値の前後に[]があります。

Java側でマッピングを変更して、サンプルに単一の値のみを期待するか、phpコードを変更して、$data['sample']が'txt'="helloworld"を持つ単一の要素を持つ配列になるようにすることができます。 。

Java側にマッピングを含めると、私はそれを支援できます。php側で修正したい場合は、phpの第一人者が役立つと確信しています。

編集:

JSONArray JSONarr=JSONobj.getJSONArray("sample");配列を要求しています。これをJSONObjectに変更すれば、準備は完了です。

于 2013-01-03T20:50:19.320 に答える
-1

問題を解決する1つの方法は、次のことを行うことです...

<?php
    $json = preg_replace('/"([a-zA-Z]+[a-zA-Z0-9]*)":/', '$1:', json_encode($whatever));
?>

取得しているJSONは完全に合法であるため、問題はJava/Dalvikコードにあると思います。JSON-RPC2.0仕様の例を確認してください。

このページには、仕様に従った特定のAndroidの例もあります。

{"hash":{"attribute":"123"},"attribute":"value", …}
于 2013-01-03T20:42:06.680 に答える