Подтвердить что ты не робот

Создание объектов 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, которую я мог использовать на стороне клиента.

Мне было интересно, возможно ли получить подобное поведение в текущем сценарии.

4b9b3361

Ответ 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.