当前位置: 首页 > 知识库问答 >
问题:

考虑到性能,我应该如何让ObjectWriter将POJO序列化为JSON?

鲍钊
2023-03-14

通讯。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的副本吗?目标作者?

共有1个答案

罗毅
2023-03-14

就像留档所说的,这是非常便宜的操作,你可以“按呼叫进行”。让我们看看每种方法背后有什么。

  • ObjectMapper。writer-使用SerializationConfigObjectMapper创建新的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