J'ai des classes de modèle comme Customer
, Product
, etc. dans mon projet qui ont plusieurs champs et leurs méthodes setter-getter, je dois échanger des objets de ces classes comme JSONObject via Sockets vers et depuis le client et le serveur.
Existe-t-il un moyen de créer JSONObject
directement à partir de l'objet de la classe de modèle de sorte que les champs de l'objet deviennent des clés et les valeurs de cet objet de la classe de modèle deviennent des valeurs pour ce JSONObject.
Exemple:
Customer c = new Customer();
c.setName("Foo Bar");
c.setCity("Atlantis");
.....
/* More such setters and corresponding getters when I need the values */
.....
Et je crée un objet JSON comme:
JSONObject jsonc = new JSONObject(c); //I'll use this only once I'm done setting all values.
Ce qui me donne quelque chose comme:
{"name":"Foo Bar","city":"Atlantis"...}
Veuillez noter que, dans certaines de mes classes de modèle, certaines propriétés sont elles-mêmes n objet d'une autre classe de modèle. Tel que:
Product p = new Product();
p.setName("FooBar Cookies");
p.setProductType("Food");
c.setBoughtProduct(p);
Dans un cas comme ci-dessus, comme je m'y attendais, l'objet JSON généré serait:
{"name":"Foo Bar","city":"Atlantis","bought":{"productname":"FooBar Cookies","producttype":"food"}}
Je sais que je pourrais créer quelque chose comme toJSONString()
dans chaque classe de modèle et faire créer et manipuler la chaîne compatible JSON, mais dans mes expériences précédentes de création de service RESTful dans Java = (ce qui est totalement hors contexte pour cette question), je pourrais renvoyer une chaîne JSON à partir de la méthode de service en utilisant @Produces(MediaType.APPLICATION_JSON)
et avoir la méthode renvoyant l'objet de la classe de modèle. Il a donc produit une chaîne JSON que je pourrais consommer côté client.
Je me demandais s'il était possible d'obtenir un comportement similaire dans le scénario actuel.
Toute aide ou suggestion est appréciée. Merci.
Google GSON fait cela; Je l'ai utilisé sur plusieurs projets et c'est simple et ça marche bien. Il peut effectuer la traduction d'objets simples sans intervention, mais il existe également un mécanisme de personnalisation de la traduction (dans les deux sens).
Gson g = ...;
String jsonString = g.toJson(new Customer());
Vous pouvez utiliser Gson pour cela:
Dépendance Maven:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.0</version>
</dependency>
Code 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);
User = new User();
Gson gson = new Gson();
String jsonString = gson.toJson(user);
try {
JSONObject request = new JSONObject(jsonString);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Utilisez gson pour y parvenir. Vous pouvez utiliser le code suivant pour obtenir le json puis
Gson gson = new Gson();
String json = gson.toJson(yourObject);
J'ai utilisé XStream Parser pour
Product p = new Product();
p.setName("FooBar Cookies");
p.setProductType("Food");
c.setBoughtProduct(p);
XStream xstream = new XStream(new JettisonMappedXmlDriver());
xstream.setMode(XStream.NO_REFERENCES);
xstream.alias("p", Product.class);
String jSONMsg=xstream.toXML(product);
System.out.println(xstream.toXML(product));
Ce qui vous donnera un tableau de chaînes JSON.