从用于IRC Bot的API解析Json数组并创建初始消息

时间:2017-11-19 21:55:08

标签: java json irc openweathermap

第一个问题:

我正在使用实现OpenWeatherMap API的Pircbot在java中创建一个IRC Bot,并且我在显示从机器人连接到该通道时发送的初始消息时遇到问题。我希望此消息显示有关如何使用API​​的说明。我尝试在构造函数中执行此操作,但由于您需要onMessage method中所示的通道字符串,因此无法正常工作。我搜索了Pircbot website中的方法,但无法找到方法。

第二个问题:

我在实现OpenWeatherMap API的某个部分时遇到了问题。对于"weather",它使用了JsonArray,而我并不完全确定如何解析它。因为它是一个API,而不是一个文件,我在网上找到的解决方案一直在工作,因为他们在尝试使用JsonParser时使用了JsonReader。这是我的代码试图解析这个数组。我试图访问" main"来自"天气" JsonArray。

static String parseJsonWeatherMain(String json)
{
    JsonElement jelement = new JsonParser().parse(json);

    JsonObject MasterWeatherObject = jelement.getAsJsonObject();

    JsonArray weatherArray = MasterWeatherObject.getAsJsonArray("weather");
    String main = weatherArray.get(1).getAsString();

    return main;
}

作为参考,这是我解析刚刚从JsonObjects中的其他键的方法:

static double parseJsonWindGust(String json)
{
    JsonElement jelement = new JsonParser().parse(json);
    JsonObject  MasterWeatherObject = jelement.getAsJsonObject();

    JsonObject windObject = MasterWeatherObject.getAsJsonObject("wind");
    double gust = windObject.get("gust").getAsDouble();

    return gust;
}

所以关于如何解析这个JsonArray的想法?我想要"主要"和"描述"确切的关键。

1 个答案:

答案 0 :(得分:0)

嗯..我不是真正的Java开发人员,但我会试一试。

问题1:当机器人加入频道时发布消息

这听起来像是一个经典的onJoin事件。

来自PircBot文档

protected void onJoin(String channel,
                      String sender,
                      String login,
                      String hostname)
  

只要有人(可能是我们)加入频道,就会调用此方法   我们在哪。

     

在PircBot中实现此方法   抽象类不执行任何操作,可以根据需要覆盖。

     

<强>参数:

     

频道 - 有人加入的频道   sender - 加入频道的用户的昵称   login - 加入频道的用户的登录信息   hostname - 加入频道的用户的主机名。

问题2:从JOArray中的JObject中提取 main 属性。

你接近解决方案,你只是忘记了一件非常基本的事情。

weather 是一个对象数组,因此您应该期望weatherArray.get(1)将返回一个对象,然后您应该应用.get("main")来提取名为json的对象属性“main”,只有你可以申请.getAsString(),因为它是一个普通的字符串。

代码(未经过测试,但这个想法可以理解)

JsonArray weatherArray = MasterWeatherObject.getAsJsonArray("weather");
for (int i = 0; i < weatherArray.size(); i++) {
    String main = weatherArray.get("main").getAsString();
    System.out.println(main);
}