Jackson流发送不完整的JSON对象



我想将JSON发送到套接字并使用JavaScript处理它。但不幸的是,JSON-Object并没有完整地发送。对象data写入输出流后,服务器接收JSON-Object,而不等待后面的任何内容。

如何写入套接字

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,记录来自socket的数据。

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

您可以在控制台中看到JSON-Object是通过两个不同的事件发送的。当我试图解析data进来时,它也会抛出错误,因为一些对象丢失了。

编辑

我注意到有时它会发送整个JSON-Object,但只有20次中的1次,如果有的话。只发送字符串字段和数字字段是完美的。

我发现你必须调用flush()close(),因为它似乎缓冲了一些数据。

From Javadoc for flush()

/**
 * 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;

相关内容

  • 没有找到相关文章

最新更新