【问题标题】:jackson Pascal Case and @JsonProperty on gettergetter 上的 jackson Pascal Case 和 @JsonProperty
【发布时间】:2014-05-05 06:23:44
【问题描述】:

我用

创建了一个映射器
new ObjectMApper()
        .setPropertyNamingStrategy(PropertyNamingStrategy.PASCAL_CASE_TO_CAMEL_CASE)
        .setSerializationInclusion(Include.NON_NULL)

并且序列化在字段上完美运行(没有 getter 和 setter)。字段currentStatus 被序列化为"currentStatus"(第一个字母大写)。但我也有一个必须是驼峰式的吸气剂(没有字段和二传手)。所以我这样做:

@JsonProperty("abcDef")
public String getZxy() {...

但它被序列化为"AbcDef" 而不是"abcDef"。看起来命名策略仍然会触发并更改第一个字母。我使用杰克逊数据绑定 2.3.2;

如何将这个 getter 映射为首字母小写?


编辑: 丑陋的代码,但显示了问题。这个测试应该通过但它失败了

import static org.assertj.core.api.Assertions.assertThat;
import org.testng.annotations.Test;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;

public class JsonFailureTest {

    @Test
    public void should_serialize_first_letter_lowercase() throws Exception {

        String json = new ObjectMapper()
                            .setPropertyNamingStrategy(PropertyNamingStrategy.PASCAL_CASE_TO_CAMEL_CASE)
                            .writeValueAsString(

        new Object(){

            @JsonProperty("fooBar")
            public String whatever() {return "";}

        });

        assertThat(json).contains("fooBar");
    }
}

【问题讨论】:

标签: java json jackson


【解决方案1】:

这是使用自定义“注释感知”策略的解决方法:

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.cfg.MapperConfig;
import com.fasterxml.jackson.databind.introspect.AnnotatedMethod;

public class Foo {
    public static void main(final String[] args) throws JsonProcessingException {
        final SomeObject someObject = new SomeObject();
        someObject.setZxy("foobar");

        final ObjectMapper mapper = new ObjectMapper();
        mapper.setPropertyNamingStrategy(new PropertyNamingStrategy.PascalCaseStrategy() {
            @Override
            public String nameForGetterMethod(final MapperConfig<?> config, final AnnotatedMethod method, final String defaultName) {
                final JsonProperty annotation = method.getAnnotation(JsonProperty.class);
                if (annotation != null) {
                    return annotation.value();
                }
                return super.nameForGetterMethod(config, method, defaultName);
            }
        });
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

        System.out.println(mapper.writeValueAsString(someObject));
    }

    private static class SomeObject {

        private String zxy;

        @JsonProperty("abcDef")
        public String getZxy() {
            return this.zxy;
        }

        public void setZxy(final String zxy) {
            this.zxy = zxy;
        }
    }
}

输出:

{"abcDef":"foobar"}

【讨论】:

    猜你喜欢
    • 2015-12-26
    • 2020-06-22
    • 1970-01-01
    • 2016-05-07
    • 2023-03-15
    • 2018-03-21
    • 2021-08-01
    • 2013-08-21
    • 1970-01-01
    相关资源
    最近更新 更多