从URL获取JSON并创建JSON对象

时间:2016-02-04 11:36:58

标签: android json urlconnection

我正在使用Async task + HttpURLConnection在Android中获取this JSON。我正试图用JSONObject解析它。这是我的班级:

public class getData extends AsyncTask<String, String, String> {
        HttpURLConnection urlConnection;
        @Override
        protected String doInBackground(String... args) {
            StringBuilder result = new StringBuilder();
            try {
                URL url = new URL("http://bitcoinstats.azurewebsites.net/api/ExchangeVolume");
                urlConnection = (HttpURLConnection) url.openConnection();
                InputStream in = new BufferedInputStream(urlConnection.getInputStream());
                BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                String line;
                while ((line = reader.readLine()) != null) {
                    result.append(line);
                }
            }catch( Exception e) {
                e.printStackTrace();
            }
            finally {
                urlConnection.disconnect();
            }
            return result.toString();
        }

        @Override
        protected void onPostExecute(String result) {

            //Do something with the JSON string
            //result = result.replace("\\", "");
            try {
                JSONObject json = new JSONObject(result);
                tv.setText("Converted");
            } catch (JSONException e) {
                Toast.makeText(getApplicationContext(),
                        "Error converting to json", Toast.LENGTH_SHORT)
                        .show();
                tv.setText(result);
                e.printStackTrace();
            }
            //tv.setText(result);
        }

    }

观察:电视是我的页面的texview,我打印结果。

我的问题是JSONException被抛出,我不知道为什么。 JSON是有效的,我检查了http://jsonlint.com/,我正确地收到了json,因为我可以完美地在TextViewer中打印它。那么为什么从String中简单地创建JSONObject不起作用呢?

7 个答案:

答案 0 :(得分:0)

您获得的结果是XML格式。 所以你必须首先解析xml然后解析json对象。

String response = response_from_URL
response = response.replaceAll("<string>", "");
response = response.replaceAll("</string>", "");

答案 1 :(得分:0)

也许“结果”格式不正确?

选中此示例:String to jsonobject in java

答案 2 :(得分:0)

这对你也有帮助。

How to automate login a website

答案 3 :(得分:0)

您的回复是<String> </String>。因此,您必须删除<String> </String>,然后定期执行。

result = result.replaceAll("<string>", "");
result = result.replaceAll("</string>", "");

现在

JSONObject json = new JSONObject(result);

希望这适合你

答案 4 :(得分:0)

回复在<string>周围包含JSON标记。我们可以使用Pattern类通过正则表达式匹配来删除它。然后将其转换为JSONObject

试试这个,

@Override
protected void onPostExecute(String result) {
    try {
        Pattern sPattern = Pattern.compile("<string xmlns=\".*\">(.*)<\\/string>");
        Matcher m = sPattern.matcher(result);
        if (m.find()) {
            result = m.group(1);
        }
        JSONObject json = new JSONObject(result);
        result = json.getString("timestamp");
        tv.setText(result);
    } catch (JSONException e) {
        Toast.makeText(getApplicationContext(),
                "Error converting to json", Toast.LENGTH_SHORT)
                .show();
        tv.setText(result);
        e.printStackTrace();
    }
}

答案 5 :(得分:0)

试试这个:

@Override
        protected void onPostExecute(String result) {

//it  first replace \ & after that extra " from result.

            result= result.replace("\\",""); 
            result = result.replaceFirst("\"","");

            Log.d("Test","Result:"+result);
            //Do something with the JSON string
            //result = result.replace("\\", "");
            try {
                JSONObject json = new JSONObject(result);
                Log.d("Test",json.toString());
    //            tv.setText("Converted");
            } catch (JSONException e) {
    //            Toast.makeText(getApplicationContext(),
    //                    "Error converting to json", Toast.LENGTH_SHORT)
    //                    .show();
    //            tv.setText(result);
                e.printStackTrace();
            }
            //tv.setText(result);
        }

After Run code and take result in Asyntask PostExcute() method

Rest client shows

答案 6 :(得分:0)

我使用Microsoft Azure来托管向我发送我想要的JSON的API。代码是用C#编写的,奇怪的是,返回JSON对象的“toString()”并尝试在我的Android应用程序中使用它是不可能的,代码中会出现一些奇怪的东西。无论如何,我的朋友,告诉我如何正确返回价值。

基本上我用“HttpResponseMessage”替换了返回类型,上面的java代码运行正常。