我一直在尝试升级JSON模块,以使用Jackson的FasterXML(2.6.3)版本,而不是旧的Codehaus模块。在升级过程中,我注意到使用FasterXML而不是Codehaus时,命名策略有所不同。

在命名策略方面,Codehaus更灵活。下面的测试突出显示了FasterXML面临的问题。如何配置ObjectMapper,使其遵循与Codehaus相同的策略?

我无法更改JSONProperty批注,因为它们有数百种。我希望升级在命名策略方面向后兼容。

import java.io.IOException;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
/*import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.PropertyNamingStrategy;*/
import org.junit.Assert;
import org.junit.Test;

public class JSONTest extends Assert {

    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class Product {

        @JsonProperty(value = "variationId")
        private String variantId;

        @JsonProperty(value = "price_text")
        private String priceText;

        @JsonProperty(value = "listPrice")
        public String listPrice;

        @JsonProperty(value = "PRODUCT_NAME")
        public String name;

        @JsonProperty(value = "Product_Desc")
        public String description;
    }

    private static final String VALID_PRODUCT_JSON =
            "{ \"list_price\": 289," +
             " \"price_text\": \"269.00\"," +
             " \"variation_id\": \"EUR\"," +
             " \"product_name\": \"Product\"," +
             " \"product_desc\": \"Test\"" +
            "}";

    @Test
    public void testDeserialization() throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);

        Product product = mapper.readValue(VALID_PRODUCT_JSON, Product.class);
        System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(product));
        assertNotNull(product.listPrice);
        assertNotNull(product.variantId);
        assertNotNull(product.priceText);
        assertNotNull(product.name);
        assertNotNull(product.description);
    }
}

最佳答案

in fasterxml版本以来,@JsonProperty会覆盖所有PropertyNamingStrategy 2.4.0。但是,尚未发布的版本2.7.0将提供feature,以允许您选择恢复旧行为。还有一个未实现的suggestion可以在每个注释级别上切换它,但这对您没有帮助。

似乎在映射时Codehaus确实将PropertyNamingStrategy应用于@JsonProperty值之上,尽管我找不到关于它的任何清晰文档。在2.4.0之前,这似乎也是fastxml中的行为。 Here是另一个注意到相同行为差异的示例。

08-27 23:53