我一直在尝试升级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是另一个注意到相同行为差异的示例。