【问题标题】:Parsing InputStream into Json object and getting a value将 InputStream 解析为 Json 对象并获取值
【发布时间】:2014-05-28 05:37:14
【问题描述】:

响应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() 这对我不起作用。

我使用的方法是:

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

【问题讨论】:

标签: java json rest


【解决方案1】:

好吧,迟到总比没有好...以下对我有用:

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

【讨论】:

    【解决方案2】:

    如果您只想使用标准库的 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");
    

    【讨论】:

    • 我想说的是,我有这个响应存储在“InputStream”对象中,我需要检索“pak_id”
    • 我更新了我的答案,所以现在您可以直接从InputStream 获取pak_id
    【解决方案3】:

    如果您查看InputStream 的文档,您会注意到它不会向您保证toString 会向您展示流的内容。

    如果您对实际流式传输流不感兴趣(如果您希望响应很小,这是合理的,就像这里的情况一样),可以先从流中获取所有字节,把将它们转换成String,然后解析String

    要从InputStream 中取出String,我建议从apache commons-io 中取出IOUtils.toString

    【讨论】:

      猜你喜欢
      • 2017-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多