web-dev-qa-db-ja.com

Javaのモデルクラスから直接JSONオブジェクトを作成する

プロジェクトにCustomerProductなどのようないくつかのモデルクラスがあり、いくつかのフィールドとそのセッター/ゲッターメソッドがあり、オブジェクトを交換する必要がありますこれらのクラスは、Socketsを介してクライアントおよびサーバーとの間でJSONObjectとして送受信されます。

オブジェクトのフィールドがキーになり、そのモデルクラスオブジェクトの値がこの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オブジェクトを次のように作成します:

_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 =(これは完全にこの質問のコンテキストから外れています)、@Produces(MediaType.APPLICATION_JSON)を使用してサービスメソッドからJSON文字列を返し、モデルクラスのオブジェクトを返すメソッドを持たせることができました。クライアント側で。

現在のシナリオで同様の動作を実現できるかどうか疑問に思っていました。

どんな助けや提案も大歓迎です。ありがとう。

26
Kushal

Google GSON これを行います;私はいくつかのプロジェクトでそれを使用しましたが、シンプルでうまく機能します。介入なしで単純なオブジェクトの翻訳を行うことができますが、翻訳を(両方向に)カスタマイズするメカニズムもあります。

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

そのために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);
18
alexey28
    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();
    }
3
Ali Azhar

これを実現するには、 gson を使用します。次のコードを使用してjsonを取得できます

Gson gson = new Gson();
String json = gson.toJson(yourObject);
2
Saurabh

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文字列配列が得られます。

0
amicngh