java - 如果领先的驼峰式单词只有一个字母长,为什么 Jackson 2 不能识别第一个大写字母?

标签 java json spring spring-mvc jackson

我将 Spring 4 MVC 与 Jackson 2 一起用于我的服务。对于其中一个操作,我有一个请求对象,该对象具有一个属性,其中前导驼峰大小写单词的长度仅为一个字母:

private String aLogId;

此类具有适当命名的 getter 和 setter:

public String getALogId() { return aLogId; }
public void setALogId(String aLogId) { this.aLogId = aLogId; }

但是,当我尝试使用相应的 JSON 属性向该服务发布请求时:

{"aLogId":"This is a log id"}

我收到来自 Spring 框架的 500 响应,说该字段无法识别并且我的 Controller 类从未被调用:

Could not read JSON: Unrecognized field "aLogId" (class

但是,当我将“L”更改为小写时,请求按预期反序列化并且我的 Controller 类被命中:

{"alogId":"This is a log id"}

当“L”显然是该属性的驼峰式约定中的第二个单词并且打算使用大写时,为什么 jackson 希望“L”是小写的?是因为第一个单词只有一个字母吗?

请求对象中还有其他属性,其中第一个单词不止一个字母,而这些属性在大小写不匹配时不会遇到同样的问题。

最佳答案

您看到的问题是由于 Jackson 使用 Java Bean 命名约定来确定 Java 类中的 Json 属性。

这里是 reference对于您看到的具体问题,建议不要将您所在领域的前两个字母中的任何一个都大写。如果您使用 IntelliJ 或 eclipse 之类的 IDE 并让 IDE 为您生成 setter,您会注意到发生了相同的“行为”,您最终会得到以下方法:

public void setaLogId(String aLogId) {
    this.aLogId = aLogId;
}

public String getaLogId() {
    return aLogId;
}

因此,当您将“L”更改为小写时,Jackson 能够找出您想要映射的字段。

如上所述,您仍然可以选择使用“aLogId”字段名称并让 Jackson 工作,您所要做的就是使用带有 aLogId< 的 @JsonProperty 注释 在里面。

@JsonProperty("aLogId")
private String aLogId;

下面的测试代码展示了它是如何工作的:

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Test {

    @JsonProperty("aLogId")
    private String aLogId;

    public void setaLogId(String aLogId) {
        this.aLogId = aLogId;
    }

    public String getaLogId() {
        return aLogId;
    }

    public static void main(String[] args) {

        ObjectMapper objectMapper = new ObjectMapper();

        Test test = new Test();

        test.setaLogId("anId");

        try {
            System.out.println("Serialization test: " + objectMapper.writeValueAsString(test));


            String json = "{\"aLogId\":\"anotherId\"}";

            Test anotherTest = objectMapper.readValue(json, Test.class);

            System.out.println("Deserialization test: " +anotherTest.getaLogId());

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

测试的输出是:

序列化测试:{"aLogId":"anId"}

反序列化测试:anotherId

关于java - 如果领先的驼峰式单词只有一个字母长,为什么 Jackson 2 不能识别第一个大写字母?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30205006/

相关文章:

java - 如何使用 RedissonSessionManager 设置 redis "session key prefix"

java - 在java的for循环中++i真的比i++快吗?

json - 用结构解码未命名的JSON数组swift 4

java - 在 Spring 中访问 Bean

spring - 静态工厂方法(Spring)

java - 如何在android中另一个名为 "Activity A"的 Activity 中使用 "Activity B"的switch case中定义的方法?

java - 如何实例化 ehcache.CacheEventListener?

sql - JSON 对象查询 SQL Server

javascript - 如何从JQuery函数中获取值

java - 即将过期的UsernameAuthenticationToken 和 @AuthenticationPrincipal