无法解析从android中的服务器检索到的json字符串,但可以解析为android中定义的字符串

时间:2012-12-01 17:39:41

标签: android json

尝试在android

中创建JSONObject时出现此错误 类型org.json.JSONException: Value {"0" : [{"original" : "car", "translation" : "araba"}]}

java.lang.String无法转换为JSONObject

如果我使用HttpClient从服务器返回的字符串,则会出现上述错误。

如果我在上面使用相同的字符串并定义一个静态字符串并解析它就没问题了。在使用HttpClient检索JSON时,是否存在一些解码或编码问题?

我正在c#中手动构建JSON字符串作为测试并将其返回

return "{\"0\" : [{\"original\" : \"car\", \"translation\" : \"araba\"}]}";

这是代码

    HttpClient httpClient = new DefaultHttpClient();
        HttpContext localContext = new BasicHttpContext();
        String s = "http://10.0.2.2:63200/OnlineArabic/api/datasen";
        HttpGet httpGet = new HttpGet(s);

    HttpResponse response = httpClient.execute(httpGet, localContext);
    HttpEntity entity = response.getEntity();
    InputStream instream = entity.getContent();

     BufferedReader reader = new BufferedReader(new InputStreamReaderinstream , "UTF-8"),8 );
         StringBuilder sb = new StringBuilder();

         String line = null;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }


        String result= convertStreamToString(instream);             
    String jsonString = sb.toString();
    JSONObject jObject = new JSONObject(jsonString);

有什么想法吗?

这是日志:

12-01 13:48:08.156: W/System.err(22947): org.json.JSONException: Value {"0" : [{"original" : "car", "translation" : "araba"}]} of type java.lang.String cannot be converted to JSONObject
12-01 13:48:08.160: W/System.err(22947):    at org.json.JSON.typeMismatch(JSON.java:107)
12-01 13:48:08.160: W/System.err(22947):    at org.json.JSONObject.<init>(JSONObject.java:158)
12-01 13:48:08.160: W/System.err(22947):    at org.json.JSONObject.<init>(JSONObject.java:171)
12-01 13:48:08.170: W/System.err(22947):    at com.ls.audioplayer.MainActivity.call(MainActivity.java:137)
12-01 13:48:08.170: W/System.err(22947):    at com.ls.audioplayer.MainActivity$1.onClick(MainActivity.java:294)
12-01 13:48:08.180: W/System.err(22947):    at android.view.View.performClick(View.java:2408)
12-01 13:48:08.180: W/System.err(22947):    at android.view.View$PerformClick.run(View.java:8816)
12-01 13:48:08.190: W/System.err(22947):    at android.os.Handler.handleCallback(Handler.java:587)
12-01 13:48:08.190: W/System.err(22947):    at android.os.Handler.dispatchMessage(Handler.java:92)
12-01 13:48:08.221: W/System.err(22947):    at android.os.Looper.loop(Looper.java:123)
12-01 13:48:08.221: W/System.err(22947):    at android.app.ActivityThread.main(ActivityThread.java:4627)
12-01 13:48:08.221: W/System.err(22947):    at java.lang.reflect.Method.invokeNative(Native Method)
12-01 13:48:08.231: W/System.err(22947):    at java.lang.reflect.Method.invoke(Method.java:521)
12-01 13:48:08.231: W/System.err(22947):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
12-01 13:48:08.240: W/System.err(22947):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
12-01 13:48:08.240: W/System.err(22947):    at dalvik.system.NativeStart.main(Native Method)

3 个答案:

答案 0 :(得分:2)

确保服务器正在发送UTF-8编码数据。另请注意,开头/结尾没有换行符号。

Eclipse的logcat工具将帮助您找到这些特殊字符。命令行上的Logcat有时不会呈现特殊字符。

答案 1 :(得分:0)

我唯一的一点就是你以某种方式破坏字符串,因为它带有你的httpget代码,我建议你使用一个库来处理http请求,例如EasyHttpClient,只需在项目中创建该类,然后而不是你所做的所有代码

EasyHttpClient client = new EasyHttpClient();
String jsonString = client.get("http://10.0.2.2:63200/OnlineArabic/api/datasen");

然后看看你是否可以把它放在一个对象中。我不能测试那段代码,遗憾的是我这里只安装了android 4.2。

答案 2 :(得分:0)

在您的代码中,

BufferedReader reader = new BufferedReader(new InputStreamReaderinstream,“UTF-8”),8);

将此更改为

BufferedReader reader = new BufferedReader(new InputStreamReader(instream,“UTF-8”),8);