Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当前推荐的将字节[]转换为JsonNode并返回的方法_Java_Json_Jackson - Fatal编程技术网

Java 当前推荐的将字节[]转换为JsonNode并返回的方法

Java 当前推荐的将字节[]转换为JsonNode并返回的方法,java,json,jackson,Java,Json,Jackson,我想从java字节数组中读取JSON“树”,然后使用Jackson将JSON“树”写回java字节数组。一种方法如下所示: ObjectMapper om = new ObjectMapper(); JsonNode old = om.createObjectNode(); byte[] arr = om.writeValueAsBytes(old); JsonNode new = om.readTree(arr); 然而,Jackson最近建议使用ObjectReader和ObjectWr

我想从java字节数组中读取JSON“树”,然后使用Jackson将JSON“树”写回java字节数组。一种方法如下所示:

ObjectMapper om = new ObjectMapper();
JsonNode old = om.createObjectNode();

byte[] arr = om.writeValueAsBytes(old);
JsonNode new = om.readTree(arr);
然而,Jackson最近建议使用ObjectReader和ObjectWriter而不是ObjectMapper,这是因为配置中的线程安全,但也因为可能只与它们相关的优化。但是,ObjectReader不支持直接使用字节数组的readTree,并且writeValueAsBytes比writeTree更通用,因此可能有某种方式(和原因)跳过类型映射逻辑


因此,今天,对于最新的Jackson(2.5),进行这两种转换的最快/最好/推荐的方法是什么?

直接使用
ObjectMapper
的问题是,如果更改映射器的配置,可能会导致问题。但是,如果您不更改基础配置,您应该是安全的(更多阅读)

但是如果您使用
ObjectReader
ObjectWriter
您是完全安全的,即使您确实更改了映射器的配置。这是可能的,因为读写器是不可变的,因此不可能更改基础状态

因此,要读取/写入字节,以下方法很好:

ObjectMapper om = new ObjectMapper();
JsonNode oldNode = om.createObjectNode();

// Writing...
// Create an immutable writer (in this case using the default settings)
final ObjectWriter writer = om.writer();

// Use the writer for thread safe access.
final byte[] bytes = writer.writeValueAsBytes(oldNode);


// Reading...
// Create an immutable reader
final ObjectReader reader = om.reader();

// Use the reader for thread safe access
final JsonNode newNode = reader.readTree(new ByteArrayInputStream(bytes));
因此,基本上您可以使用相同的原则(字节流),但是如果您需要确保您使用的是对映射器的线程安全访问,那么您应该通过
ObjectReader
ObjectWriter
来访问读/写

writeValueAsBytes
描述如下:

功能上相当于使用
java.io.ByteArrayOutputStream调用
writeValue(Writer,Object)
并获取字节,但效率更高


对于读取,您只需使用
readTree(InputStream)
版本。

您能证明使用ByteArrayInputStream与使用字节[]的readTree一样高效吗?要让它们成为这样,JsonFactory.createParser(字节[])必须和JsonFactory.createParser(InputStream)一样高效,我对此表示怀疑——但我可能错了。@Nakay,我可以很容易地说我永远不会在这件事上作证;)不过,我做了一些简单的比较,比较了不同的方法,结果可以是。好吧,你说服了我,尽管微基准总是撒谎;)谢谢,回答得很好!