【问题标题】:Convert InputStream into JSON将 InputStream 转换为 JSON
【发布时间】:2013-09-18 14:53:06
【问题描述】:

我正在使用 json-rpc-1.0.jar。下面是我的代码。我需要将 InputStream 对象转换为 JSON,因为响应是 JSON。

我确实验证了从 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);

我得到下面提到的异常:

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)

【问题讨论】:

  • 首先,应该在发送请求之前调用setContentType(),即。在getInputStream()之前。
  • 并发布您的完整堆栈跟踪。
  • 将 InputStream 转换为 Stream 可能会更好。 stackoverflow.com/questions/36047907/…

标签: java json-rpc


【解决方案1】:

利用 Jackson JSON 解析器。

参考 - Jackson Home

你唯一需要做的——

ObjectMapper mapper = new ObjectMapper();
Map<String, Object> jsonMap = mapper.readValue(inputStream, Map.class);

现在jsonMap 将包含 JSON。

【讨论】:

  • 好的。看起来像您要求参考的 Jackson 主页,是 OLD Jackson Java JSON-processor Home Page。我已经下载了 jackson-core-2.2.3.jar。它似乎没有 ObjectMapper 类。
  • 是的..他们已经转移到了 fasterxml.com。顺便说一句,您需要下载 Core、Annotation 和 Databind jar。
  • 编译错误是:Bad class file ..ObjectMapper.class。类文件有错误的版本 50.0,应该是 48.0。Tomcat 服务器运行 java 版本 1.4.2_13。我现在有两个选择。 1.更改Tomcat上的java版本。 2. 寻找任何其他兼容的 json 库。我应该去哪一个。它真的是一个小应用程序。
  • 我觉得你应该换JAVA版本,1.4真的太老了,我觉得你应该更新一下。就我而言,杰克逊比其他人都好。
【解决方案2】:

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

结果:

{"2010-07-18":0.0858,"2010-07-19":0.0808,...}

0.0858

【讨论】:

    【解决方案3】:

    通过输出为Stream&lt;JsonNode&gt;更好地节省内存

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

    【讨论】:

    • 这是什么库?
    猜你喜欢
    • 2014-04-23
    • 2011-08-11
    • 2011-07-09
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多