【问题标题】:Serializing with Jackson (JSON) - getting "No serializer found"?使用 Jackson (JSON) 进行序列化 - 得到“未找到序列化程序”?
【发布时间】:2012-01-12 03:08:19
【问题描述】:

尝试使用 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();
}

【问题讨论】:

标签: java json jackson


【解决方案1】:

Jackson 使用 getter 和 setter 序列化。/反序列化。 所以在你的模型类中添加 getter 和 setter。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      添加一个

      吸气剂

      还有一个

      二传手

      问题就解决了。

      【讨论】:

      • 尝试了很多不同的方法,解决方案就这么简单......它说得很清楚:“没有发现要创建的属性”。
      • @PhilipRego 他的意思是他为该字段添加了一个 getter 和 setter。
      • 我使用lombok库,所以我只是添加了注解Getter和Setter。一切都很好。谢谢。
      • 是的,getter 和 setter 用于 Jackson 序列化。/反序列化
      • 单独添加Getter为我解决了这个问题,无需添加setter
      【解决方案4】:

      在 Spring Boot 2.2.5 中

      添加getter和setter后

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

      【讨论】:

      • 这将忽略该属性。如果要读取的属性,那么我们应该添加getter和setter
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        添加 setter 和 getter 也将解决问题,因为它已为我修复。 例如:

        public class TestA {
            String SomeString = "asd";
        
            public String getSomeString () {        return SomeString ;     }
        
            public void setSomeString (String SS ) {        SomeString = SS ;   } 
        }
        

        【讨论】:

          【解决方案7】:

          请在类级别为 bean 使用它:

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

          【讨论】:

            【解决方案8】:

            如前所述,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);
            

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

            【讨论】:

            • 这对我有用。从 Jackson 2.0 开始, ObjectMapper#setVisibility 将 PropertyAccessor 作为第一个参数。等效的oneliner是myObjectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
            • @DanRobinson 我也用过。但实际上我正在生成 yaml 文件。所以对于 JSONString 为:{"term":{"call_failed":"true"}} 它生成 yaml 结构为:filter: map: term: map: call_failed: "true" 为什么它生成map 关键字?我怎样才能删除它?
            • 我可能在这个错误上花了 8 个小时,没有意识到我的 getter 方法上没有“public”..太愚蠢了
            • 使用对象映射器将 ClientResponse 转换为字符串时出现此错误
            • 你也可以在你的类上方添加注解@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
            【解决方案9】:

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

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

            【讨论】:

            • 你应该让你的模型有getter和setter方法。
            • 欢迎来到 SO!感谢您的贡献。请在您的答案中添加解释,以便清楚代码的作用、工作原理以及如何回答 OP 问题。
            • 这对我有帮助!但在我看来,你应该注入上下文的 ObjectMapper 并在之后配置它,而不是创建一个新的。
            【解决方案10】:

            以下是三个选项:

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

            【讨论】:

              【解决方案11】:

              我发现了至少三种方法:

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

              根据您的需要进行选择。

              【讨论】:

                【解决方案12】:

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

                @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
                

                【讨论】:

                  【解决方案13】:

                  虽然我添加了 getter 和 setter,但我遇到了同样的错误。后来我发现了一个错误,即根据 Sonar 的建议,我将 getter 和 setter 设置为受保护的,这导致了问题。一旦我修复它,它就会按预期工作。

                  【讨论】:

                    【解决方案14】:

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

                    【讨论】:

                    • 请注意这个答案是不正确的——该字段不需要是公开的或有一个getter和setter。在这个问题的另一个答案中,我提供了一种替代配置,它不需要对原始数据结构进行(反)序列化。
                    • 答案很有用,即使不是 100% 完全正确。我忘记在我的变量上加上“public”,这指出了这一点。谢谢!
                    【解决方案15】:

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

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

                    【讨论】:

                      【解决方案16】:

                      问题可能是因为您将变量声明为private。 如果你把它改成public,就可以了。

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

                      这将解决问题!

                      【讨论】:

                        【解决方案17】:

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

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

                        对于杰克逊 1.9

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

                        对于杰克逊 2.X

                        myObjectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
                        

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

                        【讨论】:

                          【解决方案18】:

                          我在通过休眠代理对象延迟加载时遇到了类似的问题。通过使用以下方式注释具有延迟加载的私有属性的类来解决它:

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

                          【讨论】:

                          • 这解决了我的问题。你能告诉我这到底是做什么的吗?
                          • 其他解决方案都不适合我。这个解决了这个问题。谁能详细解释一下上面的语句是做什么的?
                          【解决方案19】:

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

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

                          【讨论】:

                          • 当您的类有一个名称以 get 开头的方法时也会触发此错误...例如 NonSerializableClass getMyNonSerializableObject()。杰克逊试图序列化它并失败了。要解决此问题,只需添加 @JsonIgnore 或重命名方法。
                          • 使用旧版本:org.codehaus.jackson.annotate.JsonIgnore
                          【解决方案20】:

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

                          【讨论】:

                            猜你喜欢
                            • 2021-12-13
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2020-07-03
                            • 2021-07-30
                            • 1970-01-01
                            • 2014-08-02
                            相关资源
                            最近更新 更多