首页 文章

使用Jackson(JSON)进行序列化 - 获得“No serializer found”?

提问于
浏览
204

尝试使用Jackson序列化一个非常简单的对象时,我得到了一个例外 . 错误:

org.codehaus.jackson.map.JsonMappingException:没有找到类MyPackage.TestA的序列化程序,也没有发现创建BeanSerializer的属性(为了避免异常,请禁用SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS))

下面是序列化的简单类和代码 .

任何人都可以告诉我为什么会收到此错误?

public class TestA {
    String SomeString = "asd";
}

TestA testA = new TestA();
ObjectMapper om = new ObjectMapper();
try {
    String testAString = om.writeValueAsString(testA); // error here!

    TestA newTestA = om.readValue(testAString, TestA.class);
} catch (JsonGenerationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (JsonMappingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

14 回答

  • 2

    虽然我添加了getter和setter但我得到了同样的错误 . 后来我发现了一个错误,就是按照Sonar的建议,我把吸气剂和固定剂作为保护因素引起了问题 . 一旦我修复了它就像预期的那样工作 .

  • 5

    问题可能是因为您已将变量声明为 private . 如果将其更改为 public ,则可以 .

    更好的选择是使用getter和setter方法 .

    这将解决问题!

  • 0

    对于Jackson来序列化该类, SomeString 字段需要 public (现在它的包级别隔离)或者你需要为它定义getter和setter方法 .

  • 261

    如果您可以编辑包含该对象的类,我通常只需添加注释

    import com.fasterxml.jackson.annotation.JsonIgnore;
    
    @JsonIgnore 
    NonSerializeableClass obj;
    
  • 5

    我通过hibernate代理对象进行延迟加载时遇到了类似的问题 . 通过注释具有延迟加载的私有属性的类来解决它:

    @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
    
  • 27

    SpringBoot2.0,我通过以下代码解决它:

    @Bean public ObjectMapper objectMapper() {
     return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);}
    
  • 0

    以下是三个选项:

    • 已被访问的数据/类需要 public

    • 如果不是 public ,请添加 getters & setters

    • 或添加 @JsonIgnore("context")

  • 1

    我发现至少有三种方法可以做到这一点:

    • 在您尝试序列化的实体上添加 public getters ;

    • 如果您不想要 public getters ,请在实体顶部添加注释 . 这会将Jackson的默认值从 Visbility=DEFAULT 更改为 @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY) ,其中接受任何访问修饰符;

    • 通过设置 objectMapperInstance.setVisibility(JsonMethod.FIELD, Visibility.ANY); 全局更改 ObjectMapper . 如果您不需要全局此功能,则应避免这种情况 .

    根据您的需求选择 .

  • 0

    如前所述, ObjectMapper 实例的默认配置是仅访问属于公共字段或具有公共getter / setter的属性 . 更改类定义以使字段公开或提供公共getter / setter的替代方法是指定(对于底层 VisibilityChecker )不同的属性可见性规则 . Jackson 1.9提供了 ObjectMapper.setVisibility() 方便的方法 . 对于原始问题中的示例,我可能将其配置为

    myObjectMapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);
    

    有关相关配置选项的更多信息和详细信息,建议您查看the JavaDocs on ObjectMapper.setVisibility() .

  • 59

    我的问题是 Jackson 试图序列化一个没有属性和方法的空对象 .

    正如异常中所建议的,我添加了以下行以避免空bean失败:

    Jackson 1.9

    myObjectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);
    

    对于Jackson 2.X

    myObjectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
    

    你可以在jackson disable fail_on_empty_beans找到一个简单的例子

  • 18

    我的源代码中存在同样的问题 . 我刚才补充道

    getter

    二传手

    问题解决了 .

  • 3

    对于我控制的子类,我遇到了同样的问题,对象映射器在一个公共模块中并且无法访问 . 我通过为我的子类添加这个注释来解决它,它的对象是序列化的 .

    @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
    
  • 1

    如果您忘记将.build()方法添加到返回状态,也会抛出此错误 .

    return Response.status(Status.OK);         // fails
    return Response.status(Status.OK).build(); // works
    

    没有build()方法我得到以下错误:

    org.codehaus.jackson.map.JsonMappingException: No serializer found for class com.sun.jersey.core.spi.factory.ResponseBuilderImpl
    
  • 5

    对于Oracle Java应用程序,请在 ObjectMapper 实例化后添加:

    mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
    

相关问题