es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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:

IDE screenshot of program output

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La clase JSONObject pertenece al paquete org.json, mientras que la clase ObjectMapper pertenece al paquete com.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 campo xOne es porque la clase org.json.JSONObject solo mapea campos públicos y getters de un objeto a propiedades JSON. En este caso, dado que xOne es un campo privado de la clase Test, no se incluye en la salida JSON resultante.

    Por otro lado, ObjectMapper del paquete com.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 de ObjectMapper incluye tanto los campos one como xOne del objeto Test.

    Para incluir campos privados en la salida de JSONObject, es necesario definir getters y setters para esos campos con modificadores de acceso apropiados.

Comments are closed.