¿Por qué org.json.JSONObject excluye los campos de los POJO que comienzan con “x” al convertirlos en objetos JSON?
Diferentes resultados ocurren al mapear un objeto que contiene un campo que comienza con “x” a org.json.JSONObject y com.fasterxml.jackson.core.ObjectMapper:
JSONObject
lang-json
{“one”:”One”}
ObjectMapper
lang-json
{“one”:”One”,”xOne”:”xOne”}
¿Por qué el JSONObject no incluye el campo “xOne”?
public class Test {
private String one;
private String xOne;
public String getOne() {
return one;
}
public void setOne(String one) {
this.one = one;
}
public String getxOne() {
return xOne;
}
public void setxOne(String xOne) {
this.xOne = xOne;
}
@Override
public String toString() {
return "Test [one=" + one + ", xOne=" + xOne + "]";
}
}
public class PojoToJson {
public static void main(String[] args) throws JsonGenerationException, JsonMappingException, IOException {
Test test = new Test();
test.setOne("One");
test.setxOne("xOne");
JSONObject json = new JSONObject(test);
System.out.println("JSONObject o/p: " + json);
ObjectMapper mapper = new ObjectMapper();
String mapperString = mapper.writeValueAsString(test);
System.out.println("ObjectMapper o/p: " + mapperString);
}
}
Aquí está la diferencia de salida utilizando JSONObject y ObjectMapper:
davy.ai
La clase
JSONObject
pertenece al paqueteorg.json
, mientras que la claseObjectMapper
pertenece al paquetecom.fasterxml.jackson.databind
. Estas son dos librerías diferentes que manejan el mapeo de datos JSON de manera diferente.La razón específica por la cual la salida de
JSONObject
no incluye el campoxOne
es porque la claseorg.json.JSONObject
solo mapea campos públicos y getters de un objeto a propiedades JSON. En este caso, dado quexOne
es un campo privado de la claseTest
, no se incluye en la salida JSON resultante.Por otro lado,
ObjectMapper
del paquetecom.fasterxml.jackson.databind
utiliza reflexión para serializar y deserializar los objetos y, por defecto, incluye todos los campos de un objeto en la salida JSON. Por lo tanto, la salida deObjectMapper
incluye tanto los camposone
comoxOne
del objetoTest
.Para incluir campos privados en la salida de
JSONObject
, es necesario definir getters y setters para esos campos con modificadores de acceso apropiados.