当前位置: 首页 > 知识库问答 >
问题:

JavaJSON对象解析

许波涛
2023-03-14

我正在尝试运行一个返回当前天气的电报机器人(借助用户从另一个函数检测到的 ip),但 JSON 解析无法正常工作。我在返回之前从最后一行得到“线程”null Telegram Executor“java.lang.StackOverflowError中的异常”。另一种方法产生了“空指针异常”,我从这里开始了一个示例。

有什么方法可以使用java和GSON解析JSON吗?

public String palautaSaatila() throws MalformedURLException, IOException {

    String sURL = "http://api.wunderground.com/api/" + wundergroundApikey + "/conditions/q/" + valtio + "/" + kaupunki + ".json";
    System.out.println(sURL);
    // Connect to the URL using java's native library
    URL url = new URL(sURL);
    HttpURLConnection request = (HttpURLConnection) url.openConnection();
    request.connect();
    System.out.println("Connect ok");

    // Convert to a JSON object to print data
    JsonParser jp = new JsonParser(); //from gson
    JsonElement root = jp.parse(new InputStreamReader((InputStream) request.getContent())); //Convert the input stream to a json element
    JsonObject rootobj = root.getAsJsonObject(); //May be an array, may be an object. 
    String tempSaatila = new JSONObject(rootobj).toString(2);

    return tempSaatila;
}

JSON响应如下,我只需要“天气”键:

{
  "response": {
    "version":"0.1",
  "termsofService":"http://www.wunderground.com/weather/api/d/terms.html",
    "features": {
        "conditions": 1
    }
  },
  "current_observation": {
    "image": {
      "url":"http://icons.wxug.com/graphics/wu2/logo_130x80.png",
      "title":"Weather Underground",
      "link":"http://www.wunderground.com"
    },
    "display_location": {
      "full":"Oulu, Finland",
      "city":"Oulu",
      "state":"",
      "state_name":"Finland",
      "country":"FI",
      "country_iso3166":"FI",
      "zip":"00000",
      "magic":"138",
      "wmo":"02876",
      "latitude":"65.01999664",
      "longitude":"25.46999931",
      "elevation":"14.9"
    },
    "observation_location": {
      "full":"Oulu, Oulu, ",
      "city":"Oulu, Oulu",
      "state":"",
      "country":"FI",
      "country_iso3166":"FI",
      "latitude":"64.984344",
      "longitude":"25.499750",
      "elevation":"30 ft"
    },
    "estimated": {
    },
    "station_id":"IOULU38",
    "observation_time":"Last Updated on October 19, 9:17 PM EEST",
    "observation_time_rfc822":"Thu, 19 Oct 2017 21:17:35 +0300",
    "observation_epoch":"1508437055",
    "local_time_rfc822":"Thu, 19 Oct 2017 21:18:13 +0300",
    "local_epoch":"1508437093",
    "local_tz_short":"EEST",
    "local_tz_long":"Europe/Helsinki",
    "local_tz_offset":"+0300",
    "weather":"Mostly Cloudy",
    "temperature_string":"34.2 F (1.2 C)",
    "temp_f":34.2,
    "temp_c":1.2,
    "relative_humidity":"99%",
    "wind_string":"Calm",
    "wind_dir":"SW",
    "wind_degrees":233,
    "wind_mph":0.0,
    "wind_gust_mph":0,
    "wind_kph":0,
    "wind_gust_kph":0,
    "pressure_mb":"1018",
    "pressure_in":"30.06",
    "pressure_trend":"0",
    "dewpoint_string":"34 F (1 C)",
    "dewpoint_f":34,
    "dewpoint_c":1,
    "heat_index_string":"NA",
    "heat_index_f":"NA",
    "heat_index_c":"NA",
    "windchill_string":"34 F (1 C)",
    "windchill_f":"34",
    "windchill_c":"1",
    "feelslike_string":"34 F (1 C)",
    "feelslike_f":"34",
    "feelslike_c":"1",
    "visibility_mi":"6.2",
    "visibility_km":"10.0",
    "solarradiation":"0",
    "UV":"0.0","precip_1hr_string":"0.00 in ( 0 mm)",
    "precip_1hr_in":"0.00",
    "precip_1hr_metric":" 0",
    "precip_today_string":"0.00 in (0 mm)",
    "precip_today_in":"0.00",
    "precip_today_metric":"0",
    "icon":"mostlycloudy",
    "icon_url":"http://icons.wxug.com/i/c/k/nt_mostlycloudy.gif",
    "forecast_url":"http://www.wunderground.com/global/stations/02876.html",
    "history_url":"http://www.wunderground.com/weatherstation/WXDailyHistory.asp?ID=IOULU38",
    "ob_url":"http://www.wunderground.com/cgi-bin/findweather/getForecast?query=64.984344,25.499750",
    "nowcast":""
  }
}

共有2个答案

柴兴贤
2023-03-14

您可以使用下面的 GSON 示例解析 JSON 字符串

    Gson gson = new Gson();
    JsonObject jsonObject = gson.fromJson(json, JsonObject.class);
    JsonObject currentObservation = jsonObject.get("current_observation").getAsJsonObject();

    String weather = currentObservation.get("weather").getAsString();
    System.out.println("weather = " + weather);
吴同
2023-03-14

您的 StackOverflowError 是尝试使用第二个库(org.json.JSONObject 包装器)将根 gson JsonObject 序列化为 json 的结果:

String tempSaatila = new JSONObject(rootobj).toString(2);

您已经用gson解析了该文件,并且可以使用它的API来查找您想要的节点:

return rootobj
    .getAsJsonObject("current_observation")
    .get("weather")
    .getAsString();

如果你想用gson漂亮地打印一个节点,你可以这样做:

Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(rootobj);
System.out.println(json); 
 类似资料:
  • 我正在创建JSON映射器,它将为我的JPA数据库类创建JSON模式。我正在使用mbknor-jackson-jsonSchema,它很好用,但我只需要将我的子类序列化为id。到目前为止,我的结构是: 两个表类都是这样的: 基本实体包含id 问题是,是否有办法编写自定义std序列化程序来序列化表实体,使其具有属性id _ table 2:“long”而不是整个对象? 我尝试重写

  • Milo Yip 2016/11/15 本文是《从零开始的 JSON 库教程》的第六个单元解答篇。解答代码位于 json-tutorial/tutorial06_answer。 1. 重构 lept_parse_string() 这个「提取方法」重构练习很简单,只需要把原来调用 lept_set_string 的地方,改为写入参数变量。因此,原来的 lept_parse_string() 和 答案

  • 问题内容: 我无法理解如何使用Visual .NET将JSON字符串解析为c#对象。任务很简单,但是我仍然迷路…我得到了这个字符串: 这是我尝试进行消毒的代码: 我不知道在’<’和’>’之间放置什么,从网上阅读的内容中,我必须为其创建一个新的类。另外,如何获得输出?一个例子会有所帮助! 问题答案: 创建一个可以反序列化您的JSON的新类,例如:

  • Milo Yip 2016/10/29 本文是《从零开始的 JSON 库教程》的第六个单元。代码位于 json-tutorial/tutorial06。 本单元内容: JSON 对象 数据结构 重构字符串解析 实现 总结与练习 1. JSON 对象 此单元是本教程最后一个关于 JSON 解析器的部分。JSON 对象和 JSON 数组非常相似,区别包括 JSON 对象以花括号 {}(U+007B、U

  • 我从accuweather获得了以下带有json的代码 我尝试通过Jackson将此对象解析为POJO 我有json中指定的所有模型,如、数组、,由组成(在json中命名为最小值和最大值)等,它们都有私有字段和公共构造函数、getter和setter。但是我没有一些字段,因为我想省略它们(Day、night、EpochDate、Source)。 当我运行程序时,我得到了错误 com.fasterx

  • 问题内容: 我收到的JSON对象为: 它打印: 但现在我无法读取其中的任何内容。我如何获得“电子邮件”字段? 谢谢 问题答案: 您应该按照以下方式进行操作: 如果我没错的话。

  • 问题内容: 我目前正在尝试将收到的JSON对象转换为具有相同属性的TypeScript类,但无法使其正常工作。我究竟做错了什么? 员工阶层 员工字符串 我的尝试 链接到打字稿游乐场 问题答案: 编译器允许您将返回的对象强制转换为类的原因是因为typescript基于结构子类型。 您实际上并没有的实例,而是拥有一个具有相同属性的对象(如在控制台中看到的)。 一个简单的例子: (操场上的代码) 没有错

  • 上一章曾经介绍过,创建自定义对象的最简单方式就是创建一个Object 的实例,然后再为它添加属性和方法,如下所示。 var person = new Object(); person.name = "Nicholas"; person.age = 29; person.job = "Software Engineer"; person.sayName = function(){ alert