用Jackson序列化(JSON) -得到“没有找到序列化器”;?

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

< p > org.codehaus.jackson.map。JsonMappingException:没有找到序列化器 类MyPackage。TestA和没有属性 发现以创建BeanSerializer(为避免异常,禁用 SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) < / p >

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

有人能告诉我为什么我得到这个错误吗?

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();
}
465738 次浏览

Jackson要序列化那个类,SomeString字段需要是public(现在它是包级隔离),或者你需要为它定义getter和setter方法。

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

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

杰克逊>2.0:

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

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

如果忘记在返回状态中添加.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

在我的案例中,问题是Jackson试图序列化一个没有属性和方法的空对象。

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

杰克逊1.9

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

杰克逊2。X

myObjectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

你可以在Jackson禁用fail_on_empty_beans上找到一个简单的例子

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

import com.fasterxml.jackson.annotation.JsonIgnore;


@JsonIgnore
NonSerializeableClass obj;

添加一个

getter

和一个

setter

这样问题就解决了。

这个问题可能是因为你将变量声明为private。 如果你把它改为public,它可以工作

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

这样问题就解决了!

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

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

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

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

虽然我添加了getter和setter,但我得到了相同的错误。后来我发现了一个bug,这是由声纳的建议,我cgahnged的getter和setter作为保护,这是导致问题的原因。一旦我修复了,它就会像预期的那样工作。

我有同样的问题,在我有控件的子类,对象映射器是在一个公共模块,是不可访问的。我通过为我的对象要被序列化的子类添加这个注释来解决这个问题。

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)

我发现至少有三种方法:

  1. 在你要序列化的实体上添加public getters;
  2. 如果你不想要public getters,在实体的顶部添加一个注释。这将把Jackson的默认值从Visbility=DEFAULT更改为@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY),其中任何访问修饰符都可以接受;
  3. 通过设置objectMapperInstance.setVisibility(JsonMethod.FIELD, Visibility.ANY);全局改变你的ObjectMapper。如果您不需要全局使用此功能,则应该避免这种情况。

根据您的需要进行选择。

以下是三种选择:

  1. 被访问的数据/类必须为public
  2. 如果不是public,添加getter和setter
  3. 或者添加@JsonIgnore("context")

SpringBoot2.0,我通过下面的代码来解决它:

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

请在bean的类级别使用此命令:

@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})

添加setter和getter也将解决这个问题,因为它为我固定。 例:< / p >

public class TestA {
String SomeString = "asd";


public String getSomeString () {        return SomeString ;     }


public void setSomeString (String SS ) {        SomeString = SS ;   }
}

我只有getter,在添加setter之后,问题就解决了。

在春季启动2.2.5

在添加getter和setter之后

我在字段顶部添加了@JsonIgnore。

如果您使用Lomdok库(https://projectlombok.org/),则将@Data (https://projectlombok.org/features/Data)注释添加到数据对象类中。

Jackson使用getter和setter序列化。/反序列化。 因此,在模型类中添加getter和setter

对我来说,问题是import org.springframework.data.rest.core.annotation.RestResource中的注释@RestResource(exported = false)。我忘了拿掉了。

此外,当我忘记从import javax.xml.bind.annotation.XmlRootElement中添加类注释@XmlRootElement时,我得到了相同的错误。