Json.org安卓添加了奇怪的字符



我有一个使用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中的值的内容,而是定义消息结构的字符(如上面的引号字符),这向我表明这不是字符集问题。

有人见过这个吗?

您似乎正在用其他格式编写字符串,并在接收到另一种格式的文本解码时像iso到utf。

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

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

如果不知道您正在使用哪种HTTP交换(阅读更多),就不可能给您一个准确的代码片段来解决问题,但这应该很容易弄清楚。

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

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

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

我也有类似的问题。让我写更多的东西来描述我的环境。我的服务器以json格式返回数据。但我的问题与ąść这样的特殊字符有关。YOu应该知道,在这种情况下,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;
    }
}

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

最新更新