Java 在Android 2017中从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"

在我开始之前,请允许我指出,过去5个小时我一直在这里兜圈子。我尝试了每个StackOverflow方法,从API中提取一个简单的int。这看起来应该容易得多,但事实并非如此

我试图实现的是从这个URL中提取JSON信息:

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();
    }