Próbowałem uaktualnić moduły JSON, aby korzystać z wersji Jackson FasterXML (2.6.3) zamiast starych modułów Codehaus. Podczas aktualizacji zauważyłem, że strategia nazewnictwa różni się w przypadku używania FasterXML zamiast Codehaus.Jak mogę poluzować strategię nazewnictwa podczas deserializacji przy użyciu Jacksona?
Codehaus był bardziej elastyczny, jeśli chodzi o strategię nazewnictwa. Poniższy test pokazuje problem, z jakim mam do czynienia przy pomocy FasterXML. Jak mogę skonfigurować ObjectMapper
, aby był zgodny z tą samą strategią jak Codehaus?
Nie mogę zmienić adnotacji JSONProperty
, ponieważ są ich setki. Chciałbym, aby uaktualnienie było zgodne wstecz ze strategią nazewnictwa.
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 jest rozróżniana; klucze o różnej obudowie reprezentują różne rzeczy. Wygląda na to, że wersja Codehaus nie była w tym względzie niezgodna. –