【问题标题】:Exception parsing JSON from Android Java and PHP REST API从 Android Java 和 PHP REST API 解析 JSON 的异常
【发布时间】:2012-10-31 12:51:16
【问题描述】:

我想发送这样的 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 的最后一行中看到的那样,我有一些 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() 并删除第一个和最后一个字符以使其工作。

【问题讨论】:

  • respuesta 定义在哪里?在 EntityUtils.toString(respuesta.getEntity());
  • 我认为 jsonObject 的第一个字符应该是 { remove your " "
  • @ShaunBohannon 是一个错字,因为我必须用西班牙语编程,我忘了翻译这个。谢谢,已修复。
  • @DeepankerChaudhary 是 PHP 还是 Java 还是字符集(这是因为我在问,因为我不知道是哪一个)谁在插入或转义这些字符。

标签: java android json rest


【解决方案1】:

是服务器配置错误,PHP 保存在 ISO-8859-1 字符集上,因此 PHP 与 3 个不同的字符集混淆。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    相关资源
    最近更新 更多