我想发送这样的 JSON:
{"reverseme" : "Reverse Me!" }
所以我创建了这个Java:
JSONObject jsonToSend = new JSONObject()
.put("reverseme", "Reverse ME!")
如果我将其转换为 String 并将其发送到我的 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 的最后一行中看到的那样,我有一些 Android UI,它从 EditText 读取并将 JSONresult 放入 TextView。
问题是它来自服务器:
"{\"reversed\": "!EM esreveR"}"
这里有什么问题?为什么 json_encode 会转义每个字符?是字符集问题还是需要清洁或什么?
感谢任何建议。
更新 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() 并删除第一个和最后一个字符以使其工作。