【发布时间】:2020-05-06 10:05:18
【问题描述】:
我正在尝试将 org.Json JSONObject 编码为 BSON 格式字节 []。 但是,我注意到生成的 byte[] 有尾随零。虽然这些零在再次将 byte[] 反序列化为 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();
简单地从所有尾随零中修剪 byte[] 不是一种选择,因为 byte[] 可以很好地在末尾有有效的零,而不是由序列化添加的。
编辑 1
我用以下代码解决了这个问题:
RawBsonDocument bsonDoc = RawBsonDocument.parse(json.toString());
responseBson = Arrays.copyOfRange(bsonDoc.getByteBuffer().array(), 0, bsonDoc.getByteBuffer().limit());
我觉得必须是一个更优雅的答案。
【问题讨论】:
-
您需要考虑
ByteBuffer的limit(),而不是假设它已满。 -
好点!我用一个可能的解决方案更新了我的答案,包括
limit()函数。也许您可以将您的评论重新发布为答案,以便我接受? -
您应该真正使用
get()方法,而不是像这样回避整个类的设计。 -
我想我明白你的意思,我同意,这将是理想的情况。但是,在我的场景中,我必须使用一个未知且结构可能不同的 JSON 文件。此外,在我的示例中,它可能是 JSONObject。但输入也可能是一个加载的 JSON 文件。因此,从字符串表示中解析整个对象似乎是处理该问题的最佳方法,而不必担心 JSON 的不同结构。
-
或者单独迭代 JSON 中的每个标记会产生更好的结果?我也知道,以这种方式这样做,我最终可能会得到一个比简单地发送普通 JSON 更大的字节 []。不过没关系,因为这正是我想要测试的。
标签: java mongodb byte bson org.json