序列化与jackson(JSON) – 得到“没有串行器发现”?

当我试图使用Jackson序列化一个非常简单的对象时,我得到了一个exception。 错误:

org.codehaus.jackson.map.JsonMappingException:找不到类MyPackage.TestA的序列化程序,没有发现创buildBeanSerializer的属性(为避免exception,请禁用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(); } 

如前所述, ObjectMapper实例的默认configuration只能访问公有字段或公共getter / setter的属性。 另一种改变类定义以公开一个字段或提供一个公共getter / setter的方法是指定(对基础的VisibilityChecker )一个不同的属性可见性规则。 Jackson 1.9提供了ObjectMapper.setVisibility()方便的方法。 对于原始问题中的示例,我可能将其configuration为

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

有关相关configuration选项的更多信息和细节,我build议查看ObjectMapper.setVisibility()上的JavaDocs 。

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

在我的情况下,jackson试图序列化一个没有属性和方法的空对象。

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

jackson1.9

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

对于jackson2.X

 myObjectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); 

你可以在jackson禁用fail_on_empty_beans上find一个简单的例子

我的源代码中有同样的问题。 我刚刚添加

吸气

二传手

问题解决了。

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

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

如果您忘记将.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 

对于Oracle Java应用程序,请在ObjectMapper实例化之后添加以下内容:

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

问题可能是因为你已经声明variables为private 。 如果您将其更改为public ,则可以使用。

更好的select是使用getter和setter方法。

这将解决问题!

我有一个类似的问题,通过hibernate代理对象的延迟加载。 通过注释具有惰性加载私有属性的类来解决它:

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

虽然我添加了getter和setter,但是却得到了同样的错误。 后来我发现了一个错误,那就是声纳的build议,我把吸气剂和安装剂保护起来,导致这个问题。 一旦我解决了它的工作如期待。