Java 在Android 2017中从URL提取JSON数据
在我开始之前,请允许我指出,过去5个小时我一直在这里兜圈子。我尝试了每个StackOverflow方法,从API中提取一个简单的int。这看起来应该容易得多,但事实并非如此 我试图实现的是从这个URL中提取JSON信息:Java 在Android 2017中从URL提取JSON数据,java,android,json,Java,Android,Json,在我开始之前,请允许我指出,过去5个小时我一直在这里兜圈子。我尝试了每个StackOverflow方法,从API中提取一个简单的int。这看起来应该容易得多,但事实并非如此 我试图实现的是从这个URL中提取JSON信息: http://api.apixu.com/v1/current.json?key=ENTERKEYHERE&q=leeds 然后收集类别“temp_c”,应该是与“7.0”类似的东西。下面是一个呼叫外观的示例: { "location": { "name"
http://api.apixu.com/v1/current.json?key=ENTERKEYHERE&q=leeds
然后收集类别“temp_c”,应该是与“7.0”类似的东西。下面是一个呼叫外观的示例:
{
"location": {
"name": "Leeds",
"region": "West Yorkshire",
"country": "United Kingdom",
"lat": 53.81,
"lon": -1.54,
"tz_id": "Europe/London",
"localtime_epoch": 1509670055,
"localtime": "2017-11-03 0:47"
},
"current": {
"last_updated_epoch": 1509669008,
"last_updated": "2017-11-03 00:30",
"temp_c": 7,
"temp_f": 44.6,
"is_day": 0,
"condition": {
"text": "Partly cloudy",
"icon": "//cdn.apixu.com/weather/64x64/night/116.png",
"code": 1003
},
"wind_mph": 4.3,
"wind_kph": 6.8,
"wind_degree": 150,
"wind_dir": "SSE",
"pressure_mb": 1015,
"pressure_in": 30.4,
"precip_mm": 0,
"precip_in": 0,
"humidity": 93,
"cloud": 75,
"feelslike_c": 5.8,
"feelslike_f": 42.4,
"vis_km": 10,
"vis_miles": 6
}
}
我已经成功地在晚上的随机点将数据拉入应用程序,但是根本无法拉入特定的数据。目前,我的应用程序根本不会拉它,我也不知道我以前做过什么
如果这是一个被视为“重复”的问题,我真的很抱歉,但我可以向您保证,对于试图学习该语言的人,没有一个答案能够完全解释如何使用较新的API来实现这一点(有些答案似乎不再适用于API 23+)
我不是在寻找一个包含大量方法的详细应用程序,只是一种简单的方法来提取JSON数据并选择一个特定的类别。如果您能解释一下如何做到这一点,我将不胜感激,因为我计划在将来将代码修改为其他来源。谢谢大家! 您应该使用AsyncTask或AsyncTaskLoader,以便UI线程在加载期间不会延迟。搜索此术语或使用UI线程,但在加载过程中它将延迟。另外,调用此函数,url为您的url:
public static String getResponse(URL url) throws IOException {
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
InputStream in = urlConnection.getInputStream();
Scanner scanner = new Scanner(in);
scanner.useDelimiter("\\A");
boolean hasInput = scanner.hasNext();
if (hasInput) {
return scanner.next();
} else {
return null;
}
} finally {
urlConnection.disconnect();
}
可以通过调用
url = new URL(yourAddressAsAString)
上面的functoid应该返回一个字符串。将其转换为JSON对象
JSONObject obj = null;
try {
obj = new JSONObject(yourString);
} catch (Throwable t) { }
然后打电话
String tempc = String.valueOf(obj.getJSONObject("current").getJSONObject("temp_c"))
以获取有问题的对象。祝你好运 第一步将你的整个
Json
作为一个字符串,比如说String
Json\u String
,下面是你必须做的事情(阅读代码中的注释了解更多信息):
因此,从上面的示例中,使用您自己的数据,您需要知道的是:
- 所有Json代码都应该在try块和catch Json异常中
- 要从字符串中获取json对象,只需构造函数本身,如
newJSONObject(字符串)代码>
- 要获取任何内部json对象(json对象中的json对象),我们使用方法
outer_object.getJSONObject(“内部对象的字符串名称”)代码>并继续深入,直到获得对象
- 要在对象中获取字符串,我们使用
string string=json\u object.getString(“在对象中显示的字符串名称”)代码>
- 要在对象中获取Json数组,请使用
JSONArray JSONArray=your_Json_object.getJSONArray(“Array_name_as_it_出现在_Json中”)代码>
我希望这对你有帮助 我现在正试着把这些放在一起,但我有点困惑。第一个方法是否应该从onCreate()调用;然后在调用后,将以下内容放入onCreate中?您能演示一下,相对于第一段代码,将代码转换为JSON对象的位置吗?谢谢你详细的回答!
String json_string="your json string here as a normal String json object";
try {
JSONObject jsonObjectRoot=new JSONObject(json_string);
JSONObject locationObject=jsonObjectRoot.getJSONObject("location");
String name=locationObject.getString("name"); //This will return leeds
String region=locationObject.getString("region"); //This will return West YorkShire!
}catch (JSONException json_except){
//You have an exception so check if your items really exist with those names!
json_except.printStackTrace();
}