Я пытался обновить модули 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);
}
}
JSON является чувствительным к регистру; ключи с различным корпусом представляют разные вещи. Похоже, что версия Codehaus была несовместима в этом отношении. –