在Android 2017中从URL中提取JSON数据

时间:2017-11-03 00:51:24

标签: 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": "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数据和选择特定类别的简单方法。如果您能解释如何执行此操作,我将非常感激,因为我计划将来为其他来源调整代码。谢谢!

2 个答案:

答案 0 :(得分:1)

您应该使用AsyncTask或AsyncTaskLoader,以便UI-Thread在加载期间不会延迟。搜索此术语或使用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)

上面的functoin应该返回一个字符串。将其转换为JSON对象

            JSONObject obj = null;
            try {
                obj = new JSONObject(yourString);
            } catch (Throwable t) {                }

然后致电

String tempc = String.valueOf(obj.getJSONObject("current").getJSONObject("temp_c"))

获取有问题的对象。祝你好运!

答案 1 :(得分:0)

第一步将您的整个Json作为字符串让我们说String json_string,这就是您必须做的事情(请阅读代码中的注释以获取更多信息):

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

所以从上面的例子中你需要知道的是:

  • 所有Json代码都应该在try块中并捕获Json异常。
  • 从字符串中获取json对象只是一个构造函数本身,如new JSONObject(string);
  • 要获取任何内部json对象(json对象中的json对象),我们使用方法outer_object.getJSONObject("string_name_of_inner_object");并继续深入,直到获得对象为止。
  • 要在对象中获取字符串,我们使用String string=json_object.getString("the_string_name_as_it_appears_in_the_object");
  • 要在使用JSONArray jsonArray=your_json_object.getJSONArray("array_name_as_it_appears_in_json");
  • 的对象中获取Json数组

我希望这会对你有所帮助!