通讯。fasterxml。杰克逊。数据绑定。ObjectMapper JavaDocs说:
Mapper实例是完全线程安全的,前提是实例的所有配置都发生在任何读或写调用之前。如果映射器实例的配置在首次使用后被修改,更改可能会生效,也可能不会生效,配置调用本身可能会失败。如果需要使用不同的配置,有两种主要的可能性:
构建并使用ObjectReader进行阅读,ObjectWriter进行写作。这两种类型都是完全不可变的,您可以使用ObjectMapper的工厂方法或读写器本身自由创建具有不同配置的新实例。构建新的ObjectReaders和ObjectWriter是一个非常轻量级的操作,因此通常可以根据需要在每次调用的基础上创建它们,以配置JSON的可选缩进等内容。
每次我需要新的ObjectWriter时打这个电话可以吗?
jsonString = new MyObjectWriter().objectWriter().writeValueAsString(myPojo);
MyObjectWriter看起来像这样:
public class MyObjectWriter {
public ObjectWriter objectWriter()
{
return new ObjectMapper()
.writer()
.with(SerializationFeature.INDENT_OUTPUT)
.with(JsonGenerator.Feature.IGNORE_UNKNOWN);
}
}
我应该保留ObjectMapper的副本吗?目标作者?
就像留档所说的,这是非常便宜的操作,你可以“按呼叫进行”。让我们看看每种方法背后有什么。
ObjectMapper。writer
-使用SerializationConfig
从ObjectMapper
创建新的ObjectWriter
我们来看一个示例应用程序,它显示了给定的场景:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.util.Collections;
import java.util.Map;
public class JsonApp {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
ObjectWriter writer0 = mapper.writer();
ObjectWriter writer1 = writer0.with(SerializationFeature.INDENT_OUTPUT);
ObjectWriter writer2 = writer1.with(SerializationFeature.INDENT_OUTPUT);
ObjectWriter writer3 = writer2.with(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS);
Map<String, Long> map = Collections.singletonMap("key", 123L);
System.out.println(writer0 + " = " + writer0.writeValueAsString(map));
System.out.println(writer1 + " = " + writer1.writeValueAsString(map));
System.out.println(writer2 + " = " + writer2.writeValueAsString(map));
System.out.println(writer3 + " = " + writer3.writeValueAsString(map));
ObjectMapper mapper1 = new ObjectMapper();
mapper1.enable(SerializationFeature.INDENT_OUTPUT);
mapper1.enable(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS);
ObjectWriter writer4 = mapper1.writer();
System.out.println(writer4 + " = " + writer4.writeValueAsString(map));
}
}
以上应用打印:
com.fasterxml.jackson.databind.ObjectWriter@2ed94a8b = {"key":123}
com.fasterxml.jackson.databind.ObjectWriter@2a5ca609 = {
"key" : 123
}
com.fasterxml.jackson.databind.ObjectWriter@2a5ca609 = {
"key" : 123
}
com.fasterxml.jackson.databind.ObjectWriter@20e2cbe0 = {
"key" : "123"
}
com.fasterxml.jackson.databind.ObjectWriter@68be2bc2 = {
"key" : "123"
}
注意,第二个(Writer1
)和第三个(Writer2
)实例(com.fasterxml.jackson.databind.ObjectWriter@2a5ca609
)是相同的,它们也生成相同的JSON负载。
因此,我们创建并配置了ObjectWriter的第一个实例。但主要只使用最后一个实例。所有中间的都已经消失,等待由GC
收集。这样做是没有意义的。最好创建ObjectMapper实例,配置它,并通过调用Writ()
方法创建已经配置的ObjectWriter。您可以为配置的ObjectMapper实例创建类似于工厂的类,并且可以使用这些实例生成ObjectWriter-s。
我有一个映射 ,它包含一个反序列化的JSON形式。我想将其反序列化到POJO的字段中。 解决方案最好使用Gson或Jackson,因为项目已经在使用它们。 示例代码:
当返回类型为时,我创建了一个REST服务,该服务可以正常工作,但当我指定时,我会收到以下错误消息: 找不到应用程序的messagewriter=json/bodytype=json。util。ArrayList,genericType=java。util。列表 我已经尝试过了:添加jersey media jackson和jersey jackson moxy,但没有成功。 环境:我使用Glass
我有一个POJO类,它将从JSON反序列化,JSON在Spring中作为请求体出现。此POJO类包含列表 我的JSON对象如下所示 下面是示例方法调用 我遵循了给出的建议,下面给出了反序列化程序代码
这是我的JSON回复 但这就是未来的样子 正如您在第一个代码片段中看到的,“状态”为1表示没有异常,而在第二个代码片段中,“状态”为2表示更改,因此数组已填充。 我如何解析这两个??
有人能帮助我,我如何反序列化下面的JSON,我不能改变?我正在使用Jackson进行序列化。 列可以具有未知数量的标题及其值,例如,“Header1”用于行数组中。 到目前为止,我有以下结构: 问题是当我反序列化成QueryResult时映射是空的;我了解TypeReference,但不知道如何指定TypeReference 编辑: 我的对象映射器代码如下: queryResultString的内
我一直在阅读关于Jackson XML反序列化的教程(#1,#2)。我试图通过编写一些java代码来遵循示例: 根据教程,这将产生以下输出: 但是,它会导致以下错误输出: 属性顺序不正确,“id”字段包含不正确的XML元素,“note”字段包含不正确。据说,各种java注释应该会改变Jackson的行为,但似乎所有注释都被忽略了。有人知道这是为什么吗? 这是jackson xml databind