2014-04-14 30 views
4

響應JSON:

{ 
    "filename": "vcops-6.0.0-MPforAWS-1.1-1695068.pak", 
    "links": [ 
     { 
      "rel": "pak_information", 
      "href": "https://<IP>:443/casa/upgrade/cluster/pak/MPforAWS-600/information" 
     }, 
     { 
      "rel": "pak_file_information", 
      "href": "https://<IP>:443/casa/upgrade/slice/pak/MPforAWS-600/file_information" 
     }, 
     { 
      "rel": "pak_cluster_status", 
      "href": "https://<IP>:443/casa/upgrade/cluster/pak/MPforAWS-600/status" 
     } 
    ], 
    "pak_id": "MPforAWS-600" 
} 

我使用我們的框架的一個幫手。框架將響應作爲「InputStream」返回。 我想從這個「InputStream」中獲得「pak_id」。我試過inputStreamObj.toString()這對我不起作用。解析的InputStream成JSON對象,並得到一個值

我使用的方法是:

private String getPakId(InputStream uploadResponse) { 
    String pakId = null; 
    try { 
     String responseString = readInputStream(uploadResponse); 
     JSONObject jObj = new JSONObject(responseString); 
     pakId = jObj.getString("pak_id").trim(); 
     Reporter.log("Pak id is=" + pakId, true); 
    } catch (Exception e) { 
     Reporter.log("Error in getting pak_id " + e.getMessage(), true); 
    } 
    return pakId; 
} 

private String readInputStream(InputStream inputStream) throws IOException { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(
      inputStream, "UTF-8")); 
    String tmp; 
    StringBuilder sb = new StringBuilder(); 
    while ((tmp = reader.readLine()) != null) { 
     sb.append(tmp).append("\n"); 
    } 
    if (sb.length() > 0 && sb.charAt(sb.length() - 1) == '\n') { 
     sb.setLength(sb.length() - 1); 
    } 
    reader.close(); 
    return sb.toString(); 
} 
+0

什麼是你當前的代碼? – fge

+0

您必須從InputStream中讀取字符串,然後使用JSON庫對其進行解析。 –

+0

http://stackoverflow.com/questions/6511880/how-to-parse-a-json-input-stream – Joffrey

回答

0

如果只只使用標準庫所需的pak_id值:

InputStream is = ... 
String line; 
StringBuilder text = new StringBuilder(); 
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); 
while((line = reader.readLine()) != null) { 
    text.append(line).append(" "); 
} 
String pakId = text.toString().replaceAll(".*\"pak_id\": \"([^\"]+)\".*", "$1"); 
+0

我想說的是,我有這個響應存儲在「InputStream」對象,我需要檢索「pak_id」 –

+0

我更新了我的答案,所以現在你可以直接從'InputStream'獲得'pak_id'的值 –

2

如果你看一下InputStream的文檔,您會注意到它不會向您承諾toString將爲您呈現流的內容。

如果您對實際流式傳輸流不感興趣(如果您希望響應很小(這似乎就是這種情況),那麼可以先從流中獲取所有字節,將它們放入String,然後解析String

要從InputStream中獲得String,我建議從apache commons-ioIOUtils.toString

0

好了,遲到總比不到好......對我來說,工作下列:

JSONTokener tokener = new JSONTokener(new InputStreamReader(istream)); 
JSONObject result; 
try { 
    result = new JSONObject(tokener); 
} catch (JSONException e) { 
    // Handle me! 
}