3

次のようなJSONを送信したい:

{"reverseme" : "Reverse Me!" }

だから私はこのJavaを作成しました:

JSONObject jsonToSend = new JSONObject()
    .put("reverseme", "Reverse ME!")

文字列に変換してAPIに送信しても、問題はありません。

HttpClient client = new HttpClient();
HttpPost post = new HttpPost("http://192.168.0.10/api");

List<NameValuePair> postData= new ArrayList<NameValuePair>();
postParams.add(new BasicNameValuePair("json", jsonToSend.toString()));

post.setEntity(new UrlEncodedFormEntity(postData));

そこで、私のPHP APIはこれと同じくらい簡単になります(私はいくつかのことをテストしています):

<?php 
$JSON = json_decode($_POST['json'], true);

print(
    json_encode( Array(
        'reversed' : strrev($JSON['reverseme'])
    ))
); ?>

最後に、応答を読み取るJavaコードは次のとおりです。

HttpResponse httpresponse = client.execute(post);
String jsonstringresponse = EntityUtils.toString(httpresponse.getEntity()); 
JSONObject jsonresponse = new JSONObject(jsonstringresponse);

それは私にこのStackTraceを与えます:

org.json.JSONException: A JSONObject text must begin with '{' at character 1 of "{\"reversed\": "!EM esreveR"}"
    at org.json.JSONTokener.syntaxError(JSONTokener.java:448)
    at org.json.JSONObject.<init>(JSONObject.java:178)
    at org.json.JSONObject.<init>(JSONObject.java:246)
 -> at com.example.test.MainActivity.onClick(MainActivity.java:67)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:521)
    at android.view.View$1.onClick(View.java:2026)
...

もちろん、StackTraceの最後の行でわかるように、EditTextから読み取り、JSONresultをTextViewに配置するAndroidUIがいくつかあります。

問題は、サーバーから次のようになることです。

"{\"reversed\": "!EM esreveR"}"

ここでの問題は何ですか?json_encodeがすべての文字をエスケープするのはなぜですか?それは文字セットの問題ですか、それともクリーニングの必要性ですか、それとも何ですか?

アドバイスありがとうございます。


UPDATE 1 Apacheエラーログで、次の行を見つけました。

[error] PHP Warning:  json_encode(): Invalid UTF-8 sequence in argument in /var/www/controllers/api.inc.php on line 4.

PHPの設定ミスでさえあるのではないかと思いましたか?


更新2

json_encodeはスペイン語の文字列を受信して​​いました。これが、そのエラーの理由です。「Atención」を読み取ると、「ó」が原因でエラーが発生します。

私は一時的にstripslashes()を使用し、最初と最後の文字を削除して機能させています。

4

1 に答える 1

0

サーバーの構成に問題があり、PHP が ISO-8859-1 文字セットで保存されていたため、PHP が 3 つの異なる文字セットで混乱していました。

于 2012-11-08T10:46:35.733 に答える