Creación de objetos JSON directamente a partir de clases modelo en Java

Tengo algunas clases modelo como Customer, Product, etc. en mi proyecto que tienen varios campos y sus métodos setter-getter, necesito intercambiar objetos de estas clases como un JSONObject via Sockets hacia y desde cliente y servidor.

¿Hay alguna forma de crear un JSONObject directamente desde el objeto de la clase modelo de forma que los campos del objeto se conviertan en claves y los valores del objeto de la clase modelo se conviertan en valores para este JSONObject.

Ejemplo:

Customer c = new Customer();
c.setName("Foo Bar");
c.setCity("Atlantis");
.....
/* More such setters and corresponding getters when I need the values */
.....

Y creo objeto JSON como:

JSONObject jsonc = new JSONObject(c); //I'll use this only once I'm done setting all values.

Lo que me da algo como

{"name":"Foo Bar","city":"Atlantis"...}

Ten en cuenta que, en algunas de mis clases modelo, ciertas propiedades son a su vez un objeto de otra clase modelo. Tales como:

Product p = new Product();
p.setName("FooBar Cookies");
p.setProductType("Food");
c.setBoughtProduct(p);

En un caso como el anterior, como yo'd esperar, el objeto JSON rendido sería:

{"name":"Foo Bar","city":"Atlantis","bought":{"productname":"FooBar Cookies","producttype":"food"}}

Sé que podría crear algo como toJSONString() en cada clase de modelo y tener la cadena JSON-amigable creado y manipularlo a continuación, pero en mis experiencias anteriores de la creación de servicios RESTful en Java (que está totalmente fuera de contexto para esta pregunta), podría devolver cadena JSON desde el método de servicio mediante el uso de @Produces(MediaType.APPLICATION_JSON) y tienen el método de devolver objeto de la clase de modelo. Así que produjo cadena JSON, que podría consumir en el extremo del cliente.

Me preguntaba si es posible obtener un comportamiento similar en el escenario actual.

Solución

Google GSON hace esto; lo he usado en varios proyectos y es simple y funciona bien. Puede realizar la traducción de objetos sencillos sin intervención, pero también dispone de un mecanismo para personalizar la traducción (en ambas direcciones).

Gson g = ...;
String jsonString = g.toJson(new Customer());
Comentarios (5)

Puede utilizar Gson para ello:

Dependencia de Maven:


    com.google.code.gson
    gson
    2.8.0

Código Java:

Customer customer = new Customer();
Product product = new Product();

// Set your values ...

Gson gson = new Gson();
String json = gson.toJson(customer);

Customer deserialized = gson.fromJson(json, Customer.class);
Comentarios (0)

Utilice gson para conseguirlo. Puede utilizar el siguiente código para obtener el json entonces

Gson gson = new Gson();
String json = gson.toJson(yourObject);
Comentarios (1)