加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 为什么杰克逊2不认识第一个大写字母,如果领先的骆驼案例

发布时间:2020-12-15 00:02:50 所属栏目:Java 来源:网络整理
导读:我正在使用 Spring 4 MVC与杰克逊2我的服务.对于其中一个操作,我有一个请求对象具有一个属性,其中主要的骆驼情况单词这只是一个字母的长度: private String aLogId; 这个类有适当命名的getter和setter: public String getALogId() { return aLogId; }publi
我正在使用 Spring 4 MVC与杰克逊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个响应,表示该字段不被识别,并且我的控制器类从不被调用:

Could not read JSON: Unrecognized field “aLogId” (class

但是,当我将“L”更改为小写时,请求按预期方式反序列化,并且我的控制器类被击中:

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

为什么杰克逊希望“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”字段名称,并且让杰克逊工作所需要做的就是将@JsonProperty注释与其中的aLogId一起使用.

@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

希望有帮助,

何塞·路易斯

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读