【问题标题】:Converting camelCase to underscore when deserializing an object using ObjectMapper使用 ObjectMapper 反序列化对象时将 camelCase 转换为下划线
【发布时间】:2015-08-06 16:53:22
【问题描述】:

我有一个夹具文件person.json

{
   "fistName": "John"
   "lastName": "Smith"
}

我有一个名为 Person 的类

public class Person {
  private String firstName;
  private String lastName;
  //.. getters and setters
}

我使用ObjectMapper 反序列化Person,如下所示

ObjectMapper mapper = new ObjectMapper(); 
Person person = mapper.readValue(new FileInputStream(new File("person.json")),Person.class);

我收到此错误,

    java.lang.RuntimeException: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: 
Unrecognized field "firstName" (class com.foo.Person), not marked as ignorable (2 known properties: , "first_name", "last_name"])

我在使用
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES); 时遇到同样的错误。

我的问题是为什么会出现此错误以及如何解决?

【问题讨论】:

  • 为什么你认为你不应该得到这个错误?你认为setPropertyNamingStrategy 完成了什么?
  • @SotiriosDelimanolis 如果我知道,我不会问这个问题。我没有设置setPropertyNamingStrategy 得到同样的错误。我会更新问题
  • 重新编译。假设您的 JSON 没有当前的拼写错误,那么在删除 setPropertyNamingStrategy 调用时应该没有错误,更不用说同样的错误了。
  • 重新编译,JSON 没有错误。我以前使用过 ObjectMappers 并了解基础知识。令人费解的是这些下划线字段的来源。
  • 它们不是字段,它们是属性。如果您使用CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES,则该属性默认命名为firstName,即。驼峰大小写,转换为带下划线的小写,即。 first_name。如果没有这种命名策略,属性(取决于你的 getter 是什么)仍然是firstName。如果没有,你正在做一些你没有向我们展示的事情。

标签: java json spring deserialization


【解决方案1】:

因为您要求 Jackson 使用 naming strategy 将驼峰式大小写,即firstName 转换为带下划线的小写,即first_name


public class App {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        Person person = mapper.readValue(new FileInputStream(new File("/path/to/person.json")),Person.class);
        System.out.println(person);
    }
}

@Data // lombok @Data
public class Person {
    private String firstName;
    private String lastName;
}

person.json(固定):

{
    "firstName": "John",
    "lastName": "Smith"
}

输出:

Person(firstName=John, lastName=Smith)

【讨论】:

  • 我在没有为 ObjectMapper 设置命名策略的情况下得到同样的错误。我会更新问题
  • setPropertyNamingStrategy 不在时为我工作。 (杰克逊 2.6.0)
  • 当然,我也是这么理解的。但是,我对这些下划线字段的来源感到困惑。我是这个应用程序的新手,看起来应用程序中有一些设置导致了这个错误。
猜你喜欢
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
相关资源
最近更新 更多