Java を使用して Web サービスを通じて JSON 形式でデータを公開するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/57689

  •  09-06-2019
  •  | 
  •  

質問

Javaを使用してJSONでWebサービスクライアントにデータを返す簡単な方法はありますか?サーブレットやスプリングなどは大丈夫です。

役に立ちましたか?

解決

私に、 最良の Java <-> JSON パーサーは XStream です (はい、私が実際に話しているのは XML ではなく、JSON についてです)。XStream はすでに循環依存関係に対応しており、独自のドライバーやコンバーターなどを作成できるシンプルで強力な API を備えています。

敬具

他のヒント

検討してみる価値はあるかもしれない ジャージー. 。Jersey を使用すると、Restful Web サービスを XML や JSON として簡単に公開できます。

例...簡単なクラスから始める

@XmlType(name = "", propOrder = { "id", "text" })
@XmlRootElement(name = "blah")
public class Blah implements Serializable {
    private Integer id;
    private String text;

    public Blah(Integer id, String text) {
        this.id = id;
        this.text = text;
    }    

    @XmlElement
    public Integer getId() { return id; }
    public void setId(Integer id) { this.id = id; }

    @XmlElement
    public String getText() { return text; }
    public void setText(String value) { this.text = value; }
}

次にリソースを作成します

@Path("/blah")
public class BlahResource {
    private Set<Blah> blahs = new HashSet<Blah>();

    @Context
    private UriInfo context;

    public BlahResource() {
        blahs.add(new Blah(1, "blah the first"));
        blahs.add(new Blah(2, "blah the second"));
    }

    @GET
    @Path("/{id}")
    @ProduceMime({"application/json", "application/xml"})
    public Blah getBlah(@PathParam("id") Integer id) {
        for (Blah blah : blahs) {
            if (blah.getId().equals(id)) {
                return blah;
            }
        }
        throw new NotFoundException("not found");
    }
}

そしてそれを暴露します。これを行うには、Jersey の ServletContainer を使用するなど、さまざまな方法があります。(web.xml)

<servlet>
    <servlet-name>jersey</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>jersey</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

やるべきことはそれだけです...ブラウザを開いて参照してください http://localhost/blah/1. 。デフォルトでは、XML 出力が表示されます。FireFox を使用している場合は、TamperData をインストールし、 accept へのヘッダー application/json JSON 出力を確認します。

もちろんそれ以外にもたくさんのことがありますが、 ジャージー これらすべての作業が非常に簡単になります。

幸運を!

私たちは Java オブジェクトを JSON に変換するために Flexjson を使用してきましたが、非常に使いやすいことがわかりました。http://flexjson.sourceforge.net

ここではいくつかの例を示します。

public String searchCars() {
  List<Car> cars = carsService.getCars(manufacturerId);
  return new JSONSerializer().serialize(cars);
}

グラフ全体を送信する deepSerialize などの優れた機能がいくつかあり、双方向の関係を壊すことはありません。

new JSONSerializer().deepSerialize(user); 

サーバー側で日付を書式設定すると便利な場合もあります

new JSONSerializer().transform(
  new DateTransformer("dd/MM/yyyy"),"startDate","endDate"
).serialize(contract);

http://www.json.org/java/index.html 必要なものがあります。

うん!チェックアウト json-lib

がここにあります 私自身のコードからの簡略化されたコードスニペット 私のドメインオブジェクトのセットを送信します:

private String getJsonDocumenent(Object myObj) (
    String result = "oops";
    try {
        JSONArray jsonArray = JSONArray.fromObject(myObj);

        result = jsonArray.toString(2);  //indent = 2

    } catch (net.sf.json.JSONException je) {

        throw je;
    }
    return result;
}

私は google-gson が魅力的であると感じました。JSON に変換したり、逆に変換したりします。 http://code.google.com/p/google-gson/ 非常に柔軟で、オブジェクトの複雑さを簡単に処理できます。ジェネリックのサポートが気に入っています。

/*
* we're looking for results in the form
* {"id":123,"name":thename},{"id":456,"name":theOtherName},...
*
* TypeToken is Gson--allows us to tell Gson the data we're dealing with
* for easier serialization.
*/
Type mapType = new TypeToken<List<Map<String, String>>>(){}.getType();

List<Map<String, String>> resultList = new LinkedList<Map<String, String>>();

for (Map.Entry<String, String> pair : sortedMap.entrySet()) {
    Map<String, String> idNameMap = new HashMap<String, String>();
    idNameMap.put("id", pair.getKey());
    idNameMap.put("name", pair.getValue());
    resultList.add(idNameMap);
}

return (new Gson()).toJson(resultList, mapType);

Java の RESTful Web サービスについては、以下も確認してください。 レストレットAPI これは、REST Web サービス (コンテナーまたはスタンドアロン内のサーバーとクライアントの両方) に非常に強力で柔軟な抽象化を提供し、Spring および JSON とうまく統合します。

すでに述べたように、 ジャージー (JAX-RS impl) は使用するフレームワークです。ただし、Java オブジェクトと JSON 間の基本的なマッピングについては、 チュートリアル いいね。多くの代替手段とは異なり、奇妙な XML 互換性規則を使用せず、オブジェクトと直接マッピングするクリーンな JSON を読み書きします。また、null (欠落しているエントリと null を持つエントリには違いがあります)、空のリストまたは文字列 (どちらも null とは異なります) についても問題はありません。

Jackson は、JAX-RS プロバイダー jar を使用するか、単に手動で使用しても、Jersey とうまく連携します。同様に、単純な古いサーブレットでも使用するのは簡単です。入出力ストリームを取得し、ObjectMapper.readValue() と .writeValue() を呼び出すだけで完了です。

JSON形式のWebサービスを提供するためにjaxws-jsonを使用しています。プロジェクトを確認できます https://jax-ws-commons.dev.java.net/json/.

素晴らしいプロジェクトです。一度立ち上げれば、それがどれほど魅力的であるかがわかります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top