gpt4 book ai didi

java - 使用 Jackson 反序列化时如何放宽命名策略?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:17:10 26 4
gpt4 key购买 nike

我一直在尝试升级 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);
}
}

最佳答案

@JsonProperty 覆盖任何 PropertyNamingStrategy in fasterxml自版本2.4.0 .然而,尚未发布的版本2.7.0将提供 feature允许您选择回到旧的行为。还有一个未实现的 suggestion在每个注释级别切换它,但这对您没有真正的帮助。

看起来 Codehaus 在映射时确实在 @JsonProperty 值之上应用了 PropertyNamingStrategy,尽管我找不到任何明确的文档。这似乎也是 2.4.0 之前的 fasterxml 中的行为。 Here是有人注意到相同行为差异的另一个例子。

关于java - 使用 Jackson 反序列化时如何放宽命名策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33690853/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com