4

我有一个使用 Android 编写的客户端/服务器应用程序,我正在使用与 android 捆绑在一起的标准 org.json 包类来进行解析和创建。

例如,我在生成的 json 字符串中间出现了奇怪的字符(不是完整的,因为它很大):

{!lo":"es_MX","id":2791884,"os":"8"}

如您所见,(!) 感叹号随机出现,而不是双引号。我还得到其他随机字符出现在字符串中间。这很奇怪。

这是创建 JSON 对象的代码...

JSONObject jsonObject = new JSONObject();
jsonObject.put("key", someValue);

这是发送的代码..

HttpPost type = new HttpPost(<server url here>);
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("v", jsonObject.toString()));
type.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
httpClient.execute(type); // This is a DefaultHttpClient

我说的是随机的,但是这个确切位置的感叹号在许多错误中是一致的,但不是每次都一致。在每天数万条消息中,大约有 5 条消息出现此错误。通常不是插入到 json 中的值的内容,而是定义消息结构的字符(例如上面的引号字符),这表明这不是字符集问题。

有没有人遇到过这个?

4

5 回答 5

0

你没有提供足够的信息。解决问题的根本方法是将所有 (!) 字符替换为 (")。

string.replaceAll("!", "\"");

我想这是服务器端的问题。

于 2012-02-04T10:00:55.190 回答
0

看起来您的发件人没有正确设置字符集。西班牙语将有常规 ASCII 或大多数 Windows 编码中不存在的符号,您需要使用 UTF-8:

Content-Type: text/html; charset=utf-8

在不知道您正在使用哪个 HTTP 交换(阅读更多)的情况下,不可能为您提供一个准确的代码片段来解决问题 - 但这应该很容易弄清楚。

于 2012-02-02T06:40:12.277 回答
0

我也有类似的问题。让我写更多来描述我的环境。我的服务器以 json 格式返回数据。但我的问题与特殊字符有关,例如ąść. 你应该知道,json_encode()在这种情况下将从服务器返回字符串文本作为null. 我知道,这很糟糕!所以我 mysql_query('SET CHARACTER SET utf8');在选择数据库中的项目之前添加了。这让我可以从服务器中获取带有特殊变音字母的字符串。

现在在应用程序站点上,我正在通过GET方法从服务器获取数据。首先,我将结果数据存储到InputStream. 然后我将它打包到 InputStreamReader 中,并逐字节将其附加到 stringBuilder 中。准备好的附加文本正在由toString()准备好的字符串转换。然后我把它放到new JsonArray(readyString). 但是我发现 json 文本的某些部分有奇怪的字符。特别是在那些有特殊字母的地方,比如żóć. 例如"description":"aaa"抛出“descriptionPffa”:“aa”null:`。

我决定尝试另一种从数据转换结果的方法。在我从服务器转换数据的地方,我使用了下面的方法。最后,wgen 我得到了 byteArrayOutputStream 对象,我将其更改为new String(byteArray)然后以某种方式使用它new JsonArray(new String(byteArray))

public class Streams {
    public static byte[] getBytes(InputStream is) {
        int len;
        int size = 1024;
        byte[] buf = new byte[0];

        try {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            buf = new byte[size];
            while ((len = is.read(buf, 0, size)) != -1)
                bos.write(buf, 0, len);
            buf = bos.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return buf;
    }
}
于 2014-12-24T20:57:22.700 回答
0

看来您正在以其他格式编写字符串,并以其他格式(如 iso 到 utf)接收文本解码。

于 2012-02-02T05:29:48.297 回答
-1

在客户端打印 json(使用 Log.d 或类似的),并在将其发送到服务器之前查看它是否包含奇怪的字符。

于 2012-02-02T05:17:33.717 回答