Java 将 InputStream 转换为 JSON
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/18794427/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Convert InputStream into JSON
提问by Margi
I am using json-rpc-1.0.jar.Below is my code. I need to convert InputStream object into JSON since the response is in JSON.
我正在使用 json-rpc-1.0.jar.Below 是我的代码。我需要将 InputStream 对象转换为 JSON,因为响应是 JSON。
I did verify the json response obtained from Zappos API. It is valid.
我确实验证了从 Zappos API 获得的 json 响应。这是有效的。
PrintWriter out = resp.getWriter();
String jsonString = null;
URL url = new URL("http://api.zappos.com/Search?term=boots&key=my_key");
InputStream inputStream = url.openConnection().getInputStream();
resp.setContentType("application/json");
JSONSerializer jsonSerializer = new JSONSerializer();
try {
jsonString = jsonSerializer.toJSON(inputStream);
} catch (MarshallException e) {
e.printStackTrace();
}
out.print(jsonString);
I get the below mentioned exception:
我得到以下提到的异常:
com.metaparadigm.jsonrpc.MarshallException: can't marshall sun.net.www.protocol.http.HttpURLConnection$HttpInputStream
at com.metaparadigm.jsonrpc.JSONSerializer.marshall(JSONSerializer.java:251)
at com.metaparadigm.jsonrpc.JSONSerializer.toJSON(JSONSerializer.java:259)
at Communicator.doGet(Communicator.java:33)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at filters.ExampleFilter.doFilter(ExampleFilter.java:149)
采纳答案by Vishal Pawale
Make use of Hymanson JSON parser.
使用 Hymanson JSON 解析器。
Refer - Hymanson Home
参考 -Hyman逊之家
The only thing you need to do -
你唯一需要做的——
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> jsonMap = mapper.readValue(inputStream, Map.class);
Now jsonMap
will contain the JSON.
现在jsonMap
将包含 JSON。
回答by Philip Rego
ObjectMapper.readTree(InputStream) easily let's you get nested JSON with JsonNodes.
ObjectMapper.readTree(InputStream) 让我们轻松地使用 JsonNodes 获得嵌套的 JSON。
public void testMakeCall() throws IOException {
URL url = new URL("https://api.coindesk.com/v1/bpi/historical/close.json?start=2010-07-17&end=2018-07-03");
HttpURLConnection httpcon = (HttpURLConnection) url.openConnection();
httpcon.addRequestProperty("User-Agent", "Mozilla/4.0");
InputStream is = httpcon.getInputStream();
try {
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonMap = mapper.readTree(is);
JsonNode bpi = jsonMap.get("bpi");
JsonNode day1 = bpi.get("2010-07-18");
System.out.println(bpi.toString());
System.out.println(day1.toString());
} finally {
is.close();
}
}
Result:
结果:
{"2010-07-18":0.0858,"2010-07-19":0.0808,...}
0.0858
{"2010-07-18":0.0858,"2010-07-19":0.0808,...}
0.0858
回答by Alex
Better to save memory by having output as Stream<JsonNode>
通过输出为更好地节省内存 Stream<JsonNode>
private fun InputStream.toJsonNodeStream(): Stream<JsonNode> {
return StreamSupport.stream(
Spliterators.spliteratorUnknownSize(this.toJsonNodeIterator(), Spliterator.ORDERED),
false
)
}
private fun InputStream.toJsonNodeIterator(): Iterator<JsonNode> {
val jsonParser = objectMapper.factory.createParser(this)
return object: Iterator<JsonNode> {
override fun hasNext(): Boolean {
var token = jsonParser.nextToken()
while (token != null) {
if (token == JsonToken.START_OBJECT) {
return true
}
token = jsonParser.nextToken()
}
return false
}
override fun next(): JsonNode {
return jsonParser.readValueAsTree()
}
}
}