schema2 - Jackson-Java bean to JSON string: variable mayúscula convertida en minúscula en JSON
jsonobject java (1)
Estoy convirtiendo Java Bean en cadena JSON usando el método writeValueAsString de ObjectMapper donde las variables mayúsculas del bean Java se cambian a minúsculas en la cadena JSON. La versión Jackson 2.7.4 implementada. Muestra de frijol base -
public class BaseBean {
private static final long serialVersionUID = 3947489072259877540L;
private int _iXId;
private String _sPNR;
private ArrayList _alMinPriced = new ArrayList<TermBean>();
public int getXId() {
return _iXId;
}
public void setXId(int id) {
_iXId = id;
}
public String getPNRNumber() {
return _sPNR;
}
public void setPNRNumber(String _spnr) {
_sPNR = _spnr;
}
public ArrayList getMinPriced() {
return _alMinPriced;
}
public void setMinPriced(ArrayList minPriced) {
_alMinPriced = minPriced;
}
public void setMinPriced(TermBean bnTerm) {
_alMinPriced.add(bnTerm);
}
}
Anteriormente, estábamos usando net.sf.json.JSON & JSONSerializer para la conversión de Java Bean a JSON. Y la cadena JSON generada tenía nombres similares a los que tenemos Java bean. Debido al problema de rendimiento, quiero cambiar esto e implementar Jackson.
Restricciones: no podemos cambiar la convención de nomenclatura de beans de Java ya que estos beans son del proyecto anterior y hay poco margen para cambiar los nombres de las variables en bean e incluso agregar propiedades json en cada bean.
He intentado a continuación el código, pero eso no funcionó
ObjectMapper mapper = new ObjectMapper();
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CAMEL_CASE);
Además, he probado PropertyNamingStrategy personalizado pero no estoy seguro de esto.
Editado:
net.sf.json.JSON generó una cadena JSON como se menciona a continuación para el bean anterior:
{"XId":11,"PNRNumber":"123456789","minPriced":[{"name":"JSON"},{"name":"simple"}]}
Jackson generó cadena JSON como se menciona a continuación para bean anterior:
{"xid":11,"pnrnumber":"123456789","minPriced":[{"name":"JSON"},{"name":"Jackson"}]}
Como puede ver, "XId" convertido a "xid" en jackson y "PNRNumber" convertido a "pnrnumber" en jackson.
¿Hay cambios de configuración disponibles en Jackson para evitar dicha modificación? O cómo manejar tal escenario.
Se han usado los siguientes frascos:
- jackson-core-2.7.4.jar
- jackson-annotations-2.7.4.jar
- jackson-databind-2.7.4.jar
Paso 1: por favor escriba Mixin siguiente de la siguiente manera:
import java.util.ArrayList;
import com.fasterxml.jackson.annotation.JsonProperty;
public abstract class MixIn {
@JsonProperty("PNRNumber")
abstract String getPNRNumber();
@JsonProperty("XId")
abstract int getXId();
@JsonProperty("minPriced")
abstract ArrayList getMinPriced();
}
Paso 2: escriba su módulo de la siguiente manera:
import com.fasterxml.jackson.databind.module.SimpleModule;
public class MyModule extends SimpleModule{
public MyModule() {
super("ModuleName");
}
@Override
public void setupModule(SetupContext context){
context.setMixInAnnotations(BaseBean.class, MixIn.class);
}
}
Paso 3: Ahora es el momento de obtener json String de la siguiente manera:
TermBean bean1=new TermBean("JSON");
TermBean bean2=new TermBean("simple");
ArrayList list=new ArrayList();
list.add(bean1);
list.add(bean2);
BaseBean bb=new BaseBean();
bb.setXId(11);
bb.setPNRNumber("123456789");
bb.setMinPriced(list);
ObjectMapper mapper = new ObjectMapper();
Module myModule = new MyModule();
mapper.registerModule(myModule);
String jsonInString = mapper.writeValueAsString(bb);
System.out.printf( "JSON: %s", jsonInString );
Salida:
JSON: {"XId": 11, "PNRNumber": "123456789", "minPriced": [{"nombre": "JSON"}, {"nombre": "simple"}]}
Espero que esto ayude.