Создание объектов JSON непосредственно из классов модели в Java
У меня есть некоторые классы моделей, такие как Customer
, Product
и т.д. В моем проекте, которые имеют несколько полей и их методы setter-getter, мне нужно обмениваться объектами этих классов как JSONObject через Sockets, чтобы и от клиента и от сервера.
Можно ли как-нибудь создать JSONObject
непосредственно из объекта класса модели, чтобы поля объекта становились ключами, а значения этого объекта класса модели становились значениями для этого JSONObject.
Пример:
Customer c = new Customer();
c.setName("Foo Bar");
c.setCity("Atlantis");
.....
/* More such setters and corresponding getters when I need the values */
.....
И я создаю JSON Object как:
JSONObject jsonc = new JSONObject(c); //I'll use this only once I'm done setting all values.
Что заставляет меня что-то вроде:
{"name":"Foo Bar","city":"Atlantis"...}
Обратите внимание, что в некоторых моих модельных классах некоторые свойства сами являются объектом другого модельного класса. Например:
Product p = new Product();
p.setName("FooBar Cookies");
p.setProductType("Food");
c.setBoughtProduct(p);
В случае, подобном описанному выше, как я и ожидал, полученным объектом JSON будет:
{"name":"Foo Bar","city":"Atlantis","bought":{"productname":"FooBar Cookies","producttype":"food"}}
Я знаю, что мог бы создать что-то вроде toJSONString()
в каждом классе модели, а затем создать JSON-дружественную строку и манипулировать ею, но в моем предыдущем опыте создания службы RESTful в Java (что совершенно не соответствует этой теме) вопрос), я мог бы вернуть строку JSON из метода сервиса, используя @Produces(MediaType.APPLICATION_JSON)
, и иметь метод, возвращающий объект класса модели. Таким образом, он генерировал строку JSON, которую я мог использовать на стороне клиента.
Мне было интересно, возможно ли получить подобное поведение в текущем сценарии.
Ответы
Ответ 1
Google GSON делает это; Я использовал его в нескольких проектах, и он прост и работает хорошо. Он может выполнять перевод для простых объектов без вмешательства, но есть механизм для настройки перевода (в обоих направлениях).
Gson g = ...;
String jsonString = g.toJson(new Customer());
Ответ 2
Вы можете использовать Gson для этого:
Зависимость от Maven:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.0</version>
</dependency>
Код 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);
Ответ 3
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();
}
Ответ 4
Используйте gson, чтобы достичь этого. Вы можете использовать следующий код, чтобы получить json, затем
Gson gson = new Gson();
String json = gson.toJson(yourObject);
Ответ 5
Я использовал XStream Parser для
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));
Что даст вам массив строк JSON.