在Android应用程序中无法从url UTF-8编码JSON响应

时间:2014-09-26 13:47:29

标签: java android json

我有一个网址的json响应,如下面的

{
"data": [
    {
        "fav": "",
        "name": "u0637u0627u062cu0646 u0627u0644u062fu062cu0627u062c u0627u0644u0633u0648u064au0633u0631u064a u0627u0644u062bu0627u0646u064a",
        "imageurl": "http://images.media.com/userphotos/250x250/26847.jpg",
        "description": "u0633u062eu0646 u0627u0644u0641u0631u0646 <BR> u0625u0644u0649 350 u062fu0631u062cu0629 u0641u0647u0631u0646u0647u0627u064au062a (175 u062fu0631u062cu0629 u0645u0626u0648u064au0629) . <BR> u062au0631u062au064au0628 u0627u0644u062fu062cu0627u062c u0641u064a u0645u062fu0647u0648u0646 12 u00d7 8 u00d7 2 u0635u062du0646 u0627u0644u062eu0628u0632 . ",
        "details": "<BR> 6 u062cu0644u062f u060c u0627u0644u062bu062fu064a u0627u0644u062fu062cu0627u062c u0627u0644u062eu0627u0644u064au0629 u0645u0646 u0627u0644u0639u0638u0645 <BR> 6 u0634u0631u0627u0626u062d u0627u0644u062cu0628u0646 u0627u0644u0633u0648u064au0633u0631u064a <BR> 1 ( 10.75 u0623u0648u0646u0635u0629 ) u064au0645u0643u0646 u0643u0631u064au0645 u0645u0643u062bu0641 u0645u0646 u062du0633u0627u0621 u0627u0644u062fu062cu0627u062c <BR> 1/4 u0643u0648u0628 u062du0644u064au0628 u0627u0644u0635u0641u062du0629 2 u0643u0648u0628 u0645u0632u064au062c u062du0634u0648 - u0645u062du0646u0643 u0639u0634u0628u0629 <u0631 ",
        "tduration": "1 HR"
    }
]
}

在此名称,描述和详细信息字段中包含一些语言翻译内容。 我需要在我的Android应用程序中将其编码为UTF-8。 我使用了下面的代码,但这似乎不起作用。

reader = new BufferedReader(new InputStreamReader(stream,"UTF-8"));

有人对此有所了解吗?

注意:代码工作正常,但字符未编码。

2 个答案:

答案 0 :(得分:0)

您需要从输入流创建一个json对象。

StringBuilder jsonResults = new StringBuilder();
            BufferedReader rd = new BufferedReader(new InputStreamReader(
                    response.getEntity().getContent()));
            String line = "";
            while ((line = rd.readLine()) != null) {
                jsonResults.append(line);
            }
            rd.close();
            JSONObject jsonObj = new JSONObject(jsonResults.toString());

            boolean result  = jsonObj.getBoolean("someDummyKey");

在gitub上还有一个很棒的库https://github.com/loopj/android-async-http,它会为你做所有的魔术。看看吧。

答案 1 :(得分:0)

首先,您的文字应包含\u0637\u0627\u062c\u0646等序列(请注意\)。

此表示法称为 Unicode转义语法。见http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html

在字符串文字中使用时,例如String a = "\u0060";,这由编译器解释,字符串a只包含1个字符。

在JSON字符串中使用时,它由JSON解析器解码。在您的情况下,一旦正确修复了转义序列,您就可以执行以下操作:

StringBuffer sb = new StringBuffer();
String line = null;
while ((line = reader.readLine() != null) {
    sb.append(line).append(System.getProperty("line.separator"));
}
JSONObject object = new JSONObject(sb.toString());

即使您无法修复转义序列(例如,如果服务器端存在错误,您无法修复),您可能会考虑执行以下操作: / p>

JSONObject object = new JSONObject(sb.toString().replace("u06", "\\u06"));

由于所有有问题的序列似乎都在06 unicode平面(这是有意义的,它是阿拉伯字符所在的位置:http://en.wikibooks.org/wiki/Unicode/Character_reference/0000-0FFF