Ich habe versucht, die JSON-Module zu aktualisieren, um die FasterXML (2.6.3) -Versionen von Jackson anstelle der alten Codehaus-Module zu verwenden. Während des Upgrades ist mir aufgefallen, dass die Benennungsstrategie bei der Verwendung von FasterXML anstelle von Codehaus unterschiedlich ist.Wie kann ich die Namensauswahl beim Deserialisieren mit Jackson lockern?
Codehaus war flexibler, wenn es um die Benennungsstrategie ging. Der folgende Test zeigt das Problem mit FasterXML. Wie kann ich die ObjectMapper
so konfigurieren, dass sie der gleichen Strategie wie Codehaus folgt?
Ich kann die JSONProperty
Anmerkungen nicht ändern, da es Hunderte von ihnen gibt. Ich möchte, dass das Upgrade in Bezug auf die Benennungsstrategie abwärtskompatibel ist.
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 ist Groß-; Schlüssel mit unterschiedlichem Gehäuse repräsentieren verschiedene Dinge. Es scheint, dass die Codehaus-Version in dieser Hinsicht nicht konform war. –