Java org.Bson中RawBsonDocument.getByteBuffer().array()的字节数组中的尾随零

Java org.Bson中RawBsonDocument.getByteBuffer().array()的字节数组中的尾随零,java,mongodb,byte,bson,org.json,Java,Mongodb,Byte,Bson,Org.json,我试图将org.Json JSONObject编码为BSON格式的字节[]。 然而,我注意到结果字节[]后面有零。当再次将字节[]反序列化为JSON时,这些零不会造成问题,但是它们会占用大量空间。 我的代码如下: #deserializing incoming message RawBsonDocument bson = new RawBsonDocument((byte[])incomingBson); json = new JSONObject(bson.toJson()); #seria

我试图将org.Json JSONObject编码为BSON格式的字节[]。 然而,我注意到结果字节[]后面有零。当再次将字节[]反序列化为JSON时,这些零不会造成问题,但是它们会占用大量空间。 我的代码如下:

#deserializing incoming message
RawBsonDocument bson = new RawBsonDocument((byte[])incomingBson);
json = new JSONObject(bson.toJson());

#serializing response to **bson format**
RawBsonDocument bsonDoc = RawBsonDocument.parse(json.toString());
responseBson = bsonDoc.getByteBuffer().array();
简单地将字节[]从所有尾随的零中删除不是一个选项,因为字节[]的末尾可以有有效的零,而不是通过序列化添加的

编辑1

我用以下代码解决了这个问题:

RawBsonDocument bsonDoc = RawBsonDocument.parse(json.toString());
responseBson = Arrays.copyOfRange(bsonDoc.getByteBuffer().array(), 0, bsonDoc.getByteBuffer().limit());


我觉得这一定是一个更优雅的答案,我在一个类似的类中也遇到了这个问题,通过创建内部缓冲区的截断副本解决了这个问题

由于getByteBuffer返回文档对象所持有的内部缓冲区,因此未使用的结尾空格将被零填充,这导致了问题

以下是我的解决方案:

return Arrays.copyOf(writeBuffer.getInternalBuffer(), writeBuffer.getSize());

其中writeBuffer是实现org.bson的OutputBuffer接口的BasicOutputBuffer实例。因此,这在您的情况下也应该有效。

您需要考虑ByteBuffer的限制,而不是假设它已满。这一点很好!我用一个可能的解决方案更新了我的答案,包括极限函数。也许你可以把你的评论作为答案转发给我,这样我就可以接受了。你应该真正使用get方法,而不是像这样回避整个类的设计。我想我理解你的意思,我同意,这将是理想的情况。然而,在我的场景中,我必须使用未知且可能变化结构的JSON文件。另外,在我的示例中,它可能是一个JSONObject。但输入也可能是一个加载的JSON文件。因此,从字符串表示形式解析整个对象似乎是处理这个问题的最佳方式,而不必担心JSON的结构变化。或者,对JSON中的每个标记逐一进行迭代会产生更好的结果吗?我也知道,这样做,我可能会得到一个字节[],比简单地发送简单的JSON要大。不过这没关系,因为这正是我想要测试的。