28

次のような JSON 文字列としてパラメーターを取得する JAX-RS リソースがあります。

http://some.test/aresource?query={"paramA":"value1", "paramB":"value2"}

ここで JSON を使用する理由は、実際のユース ケースではクエリ オブジェクトが非常に複雑になる可能性があるためです。

JSON 文字列を Java オブジェクト (例では dto) に変換したいと思います。

@GET 
@Produces("text/plain")
public String getIt(@QueryParam("query") DataTransferObject dto ) {
    ...
}

JAX-RS は、クエリ パラメータとして渡された JSON から Java オブジェクトへのこのような変換をサポートしていますか?

4

6 に答える 6

17

はい、できますが、変換コードを自分で記述する必要があります。String幸いなことに、これは簡単です。変換を行うpublic コンストラクターを持つクラスを作成するだけです。例えば:

public class JSONParam {
    private DataTransferObject dto;

    public JSONParam(String json) throws WebApplicationException {
        try {
            // convert json string DataTransferObject and set dto
        }
        catch (JSONException e) {
            throw new WebApplicationException(Response.status(Status.BAD_REQUEST)
                    .entity("Couldn't parse JSON string: " + e.getMessage())
                    .build());
        }
    }

    public DataTransferObject getDTO() {
        return dto;
    }
}

次に、次を使用できます。

@GET 
@Produces("text/plain")
public String getIt(@QueryParam("query") JSONParam json) {
    DataTransferObject dto = json.getDTO();
    ...
}
于 2010-04-23T12:20:53.160 に答える
11

前述のように、String パラメータから JSON に明示的に変換する必要があります。しかし、org.json のパーサーのように原始的なものを使用する必要はありません。JacksonまたはGsonは、1 行または 2 行でデータ バインディング (文字列から JSON、JSON から POJO) を実行できます。ジャクソンと:

MyValue value = new ObjectMapper().readValue(json, MyValue.class);

(実稼働コードの場合、ObjectMapper を静的メンバーとして 1 回だけ作成し、再利用します)

Jackson は、ほとんどの JAX-RS 実装が POST データのデータバインディングを実装するために使用するものであるため、これは非常に似ています。

于 2011-01-07T19:46:20.853 に答える
8

http://www.json.org/java/ (Crockford 提供)を使用して、Jason のソリューションに追加します。

import org.json.JSONObject;

public class JSONParam {
    private DataTransferObject dto;

    public JSONParam(String json) throws WebApplicationException {
        try {
            // convert json string DataTransferObject and set dto
            JSONObject jo = new JSONObject(json);
            dto.setParamA(jo.getString("paramA"));
            dto.setParamB(jo.getString("paramB"));
            // There are other get methods for Integer, Double, etc. 
            // You can also build JSON from Java objects.
        }
        catch (JSONException e) {
            throw new WebApplicationException(Response.status(Status.BAD_REQUEST)
                    .entity("Couldn't parse JSON string: " + e.getMessage())
                    .build());
        }
    }

     public DataTransferObject getDTO() {
        return dto;
    }                  
}

車輪を再発明しないでください:-)

于 2011-01-07T17:47:01.757 に答える
4

JAX-RSは、JAXB(Java API for XML Binding)を使用してJavaBeanをXMLまたはJSONにバインドし、その逆もサポートします。詳細については、たとえば、http ://www.ibm.com/developerworks/web/library/wa-aj-tomcat/index.htmlを参照してください。

必要がある

  • DataTransferObjectに@XmlRootElementアノテーションを追加します
  • DataTransferObjectで空のデフォルトコンストラクターを作成します
  • @Consumes(MediaType.APPLICATION_JSON)アノテーションをWebサービスに追加します
于 2011-06-06T10:32:07.763 に答える
0

DTO の生成に興味がある場合は、 jsonschema2pojo をお勧めできますか? JSON スキーマを使用してオブジェクトを定義し、DTO を自動的に生成できます。

スキーマを作成したら、要求をどのようにフォーマットする必要があるかを消費者が正確に理解できるように、それを消費者に提供することもできます。

于 2011-02-20T19:02:34.553 に答える