java - 获取Json信息

标签 java json api twitch minimal-json

我正在用Java进行编码,并且正在使用minimal-json库。我试图从json文本(idk,如果是数组)中获取一些信息。

我正在尝试访问“流”中的“游戏”值,但是我总是由于nullpointer或parseexception而崩溃。

这是我想要获取的json字符串(来自Twitch Api):

{"_links":{"self":"https://api.twitch.tv/kraken/streams/hackerc0w","channel":"https://api.twitch.tv/kraken/channels/hackerc0w"},"stream":{"_id":13817896816,"game":"Programming","viewers":13,"created_at":"2015-04-01T13:54:54Z","video_height":1080,"average_fps":59.9235368156,"_links":{"self":"https://api.twitch.tv/kraken/streams/hackerc0w"},"preview":{"small":"http://static-cdn.jtvnw.net/previews-ttv/live_user_hackerc0w-80x45.jpg","medium":"http://static-cdn.jtvnw.net/previews-ttv/live_user_hackerc0w-320x180.jpg","large":"http://static-cdn.jtvnw.net/previews-ttv/live_user_hackerc0w-640x360.jpg","template":"http://static-cdn.jtvnw.net/previews-ttv/live_user_hackerc0w-{width}x{height}.jpg"},"channel":{"_links":{"self":"https://api.twitch.tv/kraken/channels/hackerc0w","follows":"https://api.twitch.tv/kraken/channels/hackerc0w/follows","commercial":"https://api.twitch.tv/kraken/channels/hackerc0w/commercial","stream_key":"https://api.twitch.tv/kraken/channels/hackerc0w/stream_key","chat":"https://api.twitch.tv/kraken/chat/hackerc0w","features":"https://api.twitch.tv/kraken/channels/hackerc0w/features","subscriptions":"https://api.twitch.tv/kraken/channels/hackerc0w/subscriptions","editors":"https://api.twitch.tv/kraken/channels/hackerc0w/editors","videos":"https://api.twitch.tv/kraken/channels/hackerc0w/videos","teams":"https://api.twitch.tv/kraken/channels/hackerc0w/teams"},"background":null,"banner":null,"broadcaster_language":"en","display_name":"hackerc0w","game":"Programming","logo":null,"mature":false,"status":"Coding a Chatbot in C","partner":false,"url":"http://www.twitch.tv/hackerc0w","video_banner":null,"_id":41236491,"name":"hackerc0w","created_at":"2013-03-11T17:08:22Z","updated_at":"2015-04-01T17:17:44Z","delay":0,"followers":28,"profile_banner":null,"profile_banner_background_color":null,"views":2948,"language":"de"}}}

如果实时流媒体直播了,我得到的方式是这样的:

public static boolean isStreamLive(String channel) { try { URL url = new URL(TWITCH_STREAM.replace("$c$", channel)) ); URLConnection conn = url.openConnection(); BufferedReader br = new BufferedReader( new InputStreamReader( conn.getInputStream() )); String inputLine = br.readLine(); br.close(); JsonObject jsonObj = JsonObject.readFrom(inputLine); return ( jsonObj.get("stream").isNull() )?false:true; } catch (IOException e) { return false; } }

我主要尝试复制上述方法。但是我一直在查看该库的文档以了解知识,并且我已经尝试了很多东西。
最后是这样的:

public static String checkGame(String channel) { if (!isStreamLive(channel)) return "El Estreamer esta Offline!"; try { URL url = new URL( insertChannel(TWITCH_STREAM, channel) ); URLConnection conn = url.openConnection(); BufferedReader br = new BufferedReader( new InputStreamReader( conn.getInputStream() )); String inputLine = br.readLine(); br.close(); JsonObject object = JsonObject.readFrom(inputLine); JsonValue value = object.get("stream").asObject(); String msg = value.valueOf("status").toString(); return msg; } catch (IOException e) { return "Algo raro paso :/ error: 3"; } return channel; }

最佳答案

您所显示的代码有两个主要问题。

您遇到的第一个问题是您试图从错误的嵌套对象中获取状态。您是从原始json中获取stream对象,然后尝试从中获取status键的值,但是在您发布的json中,status是嵌套的channel对象的一部分。

json对象的结构如下:

{
    "_links": { ... },
    "stream": {
        ...
        "channel":{
            "_links": { ...  },
            ...
            "status":"Coding a Chatbot in C",
            ...
        }
    }
}


...所以您不能直接从status获取stream,您需要从channel获取stream并从中获取status



第二个问题是您试图使用valueOf()JsonObject中提取值。 valueOf()是一个静态方法,它根据提供的输入创建一个新对象,因此它实际上并不使用您调用它的对象中的数据。

调用value.valueOf("status")将完全忽略value中的数据,并创建一个包含字符串“ status”的新JsonObject

如果要获取嵌套对象的值,则需要使用一系列连续的get("objName").asObject()调用对其进行深入研究,然后调用.get("key")以获得所需的值:

    // hardcoded for example, actually would be read from BufferedReader
    String inputLine = "{\"_links\":{\"self\":\"https://api.twitch.tv/kraken/streams/hackerc0w\",\"channel\":\"https://api.twitch.tv/kraken/channels/hackerc0w\"},\"stream\":{\"_id\":13817896816,\"game\":\"Programming\",\"viewers\":13,\"created_at\":\"2015-04-01T13:54:54Z\",\"video_height\":1080,\"average_fps\":59.9235368156,\"_links\":{\"self\":\"https://api.twitch.tv/kraken/streams/hackerc0w\"},\"preview\":{\"small\":\"http://static-cdn.jtvnw.net/previews-ttv/live_user_hackerc0w-80x45.jpg\",\"medium\":\"http://static-cdn.jtvnw.net/previews-ttv/live_user_hackerc0w-320x180.jpg\",\"large\":\"http://static-cdn.jtvnw.net/previews-ttv/live_user_hackerc0w-640x360.jpg\",\"template\":\"http://static-cdn.jtvnw.net/previews-ttv/live_user_hackerc0w-{width}x{height}.jpg\"},\"channel\":{\"_links\":{\"self\":\"https://api.twitch.tv/kraken/channels/hackerc0w\",\"follows\":\"https://api.twitch.tv/kraken/channels/hackerc0w/follows\",\"commercial\":\"https://api.twitch.tv/kraken/channels/hackerc0w/commercial\",\"stream_key\":\"https://api.twitch.tv/kraken/channels/hackerc0w/stream_key\",\"chat\":\"https://api.twitch.tv/kraken/chat/hackerc0w\",\"features\":\"https://api.twitch.tv/kraken/channels/hackerc0w/features\",\"subscriptions\":\"https://api.twitch.tv/kraken/channels/hackerc0w/subscriptions\",\"editors\":\"https://api.twitch.tv/kraken/channels/hackerc0w/editors\",\"videos\":\"https://api.twitch.tv/kraken/channels/hackerc0w/videos\",\"teams\":\"https://api.twitch.tv/kraken/channels/hackerc0w/teams\"},\"background\":null,\"banner\":null,\"broadcaster_language\":\"en\",\"display_name\":\"hackerc0w\",\"game\":\"Programming\",\"logo\":null,\"mature\":false,\"status\":\"Coding a Chatbot in C\",\"partner\":false,\"url\":\"http://www.twitch.tv/hackerc0w\",\"video_banner\":null,\"_id\":41236491,\"name\":\"hackerc0w\",\"created_at\":\"2013-03-11T17:08:22Z\",\"updated_at\":\"2015-04-01T17:17:44Z\",\"delay\":0,\"followers\":28,\"profile_banner\":null,\"profile_banner_background_color\":null,\"views\":2948,\"language\":\"de\"}}}";

    JsonObject object = JsonObject.readFrom(inputLine);    // parse json into object
    JsonObject stream = object.get("stream").asObject();   // get "stream" sub-object
    JsonObject channel = stream.get("channel").asObject(); // get "channel" sub-object
    JsonValue status = channel.get("status");              // get the value of "status"
    String msg = status.asString();
    System.out.println(msg);  // Coding a Chatbot in C

关于java - 获取Json信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29397630/

相关文章:

java - 使用基于键列表的流过滤器映射

java - 使用 Camel 从 Web 服务获取数据

java - 如何忽略图像和其他不必要的文件以缩短 Jsoup 的响应时间

jquery - 通过 GET 将 JSON 数组传递给 MVC Web API

javascript - 如何使用 JavaScript 从 firebase JSON 检索每个对象的数据

java - 未找到 org.springframework.web.servlet.mvc.SimpleFormController

json - Postgres JSON 类型的 JPA2/Hibernate Criteria 或 CriteriaQuery

jquery - 使用 Jquery (jmespath) 从 Ansible 获取 API 调用

Python 请求 Get(URL) 200 响应,无数据

Javascript/剪贴板 API/Safari iOS/NotAllowedError 消息