我正在使用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不起作用呢?
答案 0 :(得分:0)
您获得的结果是XML格式。 所以你必须首先解析xml然后解析json对象。
String response = response_from_URL
response = response.replaceAll("<string>", "");
response = response.replaceAll("</string>", "");
答案 1 :(得分:0)
也许“结果”格式不正确?
答案 2 :(得分:0)
这对你也有帮助。
答案 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);
}
答案 6 :(得分:0)
我使用Microsoft Azure来托管向我发送我想要的JSON的API。代码是用C#编写的,奇怪的是,返回JSON对象的“toString()”并尝试在我的Android应用程序中使用它是不可能的,代码中会出现一些奇怪的东西。无论如何,我的朋友,告诉我如何正确返回价值。
基本上我用“HttpResponseMessage”替换了返回类型,上面的java代码运行正常。