2015-04-01 283 views
1

我使用Java編碼,並使用minimal-json庫。我試圖從json文本中獲取一些信息(如果它是數組,則爲idk)。獲取Json信息

我試圖訪問「流」內的「遊戲」值,但我總是通過nullpointer或parseexception得到崩潰。

這裏是我想要得到的JSON字符串(從抽搐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"}}}

我如果livestreamer是生活的方式是這樣的:

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

+0

BTW忽視頻道,不是我的頻道,它的朋友 – CavariuX 2015-04-01 18:02:53

+0

崩潰的那一行是我獲得的價值,也是編輯 – CavariuX 2015-04-01 18:19:27

+0

thnxs @azurefrog編輯 – CavariuX 2015-04-01 18:28:32

回答

1

你有兩個主要問題的代碼,你已經證明。

您遇到的第一個問題是您試圖從錯誤的嵌套對象中獲取狀態。你從原始的json獲得stream對象,然後試圖從中獲得status鍵的值,但是在你發佈的json中,status是嵌套的channel對象的一部分。

JSON對象的結構,像這樣:

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

...所以你不能從stream得到status直接,你需要從streamchannel並獲得status


的第二個問題是,你正在嘗試使用valueOf()拉值了JsonObject的。 valueOf()是一個靜態方法,該方法根據提供的輸入創建一個新對象,因此它實際上不會在您調用它的對象中使用數據。

調用value.valueOf("status")value會完全忽略的數據,並創建一個新的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 
+0

謝謝!幫助! – CavariuX 2015-04-01 23:19:09