Json.org Android添加奇怪的角色

时间:2012-01-25 20:29:02

标签: android org.json

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

有没有人遇到过这个?

5 个答案:

答案 0 :(得分:0)

似乎你正在以其他格式编写字符串,并以另一种格式接收文本解码 喜欢iso到utf。

答案 1 :(得分:0)

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

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

在不知道您正在使用哪个HTTP交换(read more)的情况下,无法为您提供确切的代码段来解决问题 - 但这应该很容易理解。

答案 2 :(得分:0)

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

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

我想这是服务器端问题。

答案 3 :(得分: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;
    }
}

答案 4 :(得分:-1)

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