【问题标题】:Jackson stream sends incomplete JSON objectsJackson 流发送不完整的 JSON 对象
【发布时间】:2015-08-18 18:09:32
【问题描述】:

我想将 JSON 发送到套接字并使用 JavaScript 处理它。但不幸的是,JSON-Object 并未完整发送。将对象data 写入输出流后,服务器会收到 JSON 对象,而不是等待之后发生的任何事情。

我如何写入套接字

jsonGenerator.writeStartObject();
jsonGenerator.writeStringField("from", from);
jsonGenerator.writeObjectField("data", data);
jsonGenerator.writeEndObject();

服务器处理程序在某一时刻收到的内容

{"from":"me","data":{"one":1,"two":2}

如您所见,最后一个} 未被写入。如果我在from 字段之前写data 对象,服务器会得到这个:

{"data":{"one":1,"two":2}

JSON 对象的其余部分将被发送,但不会作为一个实体发送,这使得在服务器上难以解析。

JsonGenerator 是这样创建的

JsonGenerator jsonGenerator = (new JsonFactory()).createGenerator(socket.getOutputStream());
jsonGenerator.setCodec(new ObjectMapper());

我怀疑它与编解码器设置有关。

服务器端

是一个简单的 NodeJS,它记录来自套接字的数据。

net.createServer(function(socket) {
    socket.on("data", function(data) {
        console.log(data.toString());
    });
}).listen(8080);

您可以在控制台中看到 JSON 对象是通过 2 个不同的事件发送的。当我尝试解析传入的data 时,它也会引发错误,因为缺少某些对象。

编辑

我注意到有时它会发送整个 JSON-Object,但如果有的话,也只会发送 20 次。只发送字符串字段和数字字段可以完美地工作。

【问题讨论】:

  • “服务器处理程序在某一点收到的内容”可以记录另一端发送的内容吗?
  • 是的,我可以,它是一个简单的 NodeJS 服务器,它将传入的数据记录到控制台。我添加了上面的代码。
  • 我的意思是,你可以记录比 Java 端发送的内容,而不是 Node.js 接收的内容。

标签: java json stream jackson


【解决方案1】:

我发现你必须调用 flush()close() 是否似乎缓冲了一些数据。

来自flush()的Javadoc

/**
 * Method called to flush any buffered content to the underlying
 * target (output stream, writer), and to flush the target itself
 * as well.
 */
@Override
public abstract void flush() throws IOException;

【讨论】:

  • 解析data对象后为什么会缓冲?在将所有内容发送到流中之后,我刷新了JsonGeneratorsocket.getOutputStream(),但它没有帮助。
猜你喜欢
  • 2021-10-10
  • 1970-01-01
  • 2019-11-20
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多