3

編集:私は混乱していました-ジャージではなくcxfを使用していました。注釈付きオブジェクトを、jacksonのObjectMapperに似たjsonに変換する方法はありますか?

元のメッセージ:

こんにちは。現在、jaxrsを使用してWeb応答をxml/jsonに変換しています。ただし、ここで実行したいのは、ObjectMapper(?)を使用してコード内に同等のjson文字列を生成することです。

たとえば、コントローラーとjaxb注釈付きの戻りオブジェクトがあるとします。

@Path("/foo")
@Produces({"application/json", "application/xml"})
public class FooController {

    @GET
    @Path("/some_action")
    public TopDTO someAction(@QueryParam("arg") String arg) {
        ...
    }
}

@XmlRootElement(name="topDTO")
@XmlAccessorType(XmlAccessType.NONE)
public class TopDTO {
    ...
    @XmlAttribute(name="attr")
    public String getAttr() {
        return "blah";
    }
    @XmlElement(name="innerDTO")
    public InnerDTO getInnerDTO() {
       ...
    }
}

@XmlRootElement(name="innerDTO")
@XmlAccessorType(XmlAccessType.NONE)
public class InnerDTO {
    ...  
}

http://myserver /.../foo.jsonを押すと、かなりのjsonが出力されます。

{"topDTO":{"@attr":"blah","innerDTO":...}}

今、私はその正確なjsonを内部で生成できるようにしたいと思います:

ObjectMapper mapper = new ObjectMapper();
AnnotationIntrospector introspector = new JaxbAnnotationIntrospector();
mapper.getSerializationConfig().setAnnotationIntrospector(introspector);
mapper.getSerializationConfig().setSerializationInclusion(Inclusion.ALWAYS);            
mapper.getSerializationConfig().set(SerializationConfig.Feature.AUTO_DETECT_FIELDS, false);
mapper.getSerializationConfig().set(SerializationConfig.Feature.WRAP_ROOT_VALUE, true);
return mapper.writeValueAsString(snapshotDTO);

ただし、これはまったく機能していないようです。注釈付きの属性と要素のほとんどが欠落しており、jaxrs出力などの場合のように、属性の前に「@」が付いていません。

私は何か簡単なものが欠けていますか?jaxrs自体はどのようにして注釈付きオブジェクトをjson文字列に変換しますか?

ありがとう!ジョー

4

3 に答える 3

3

JSONJAXBContextを使用してマーシャラーを作成し、それを使用してオブジェクトを JSON 形式にシリアライズします。ジャクソンはいらないと思います。

  JSONJAXBContext c = create the context
  JSONMarshaller m = c.createJSONMarshaller();
  YourJAXBObject obj = your object
  StringWriter writer = some writer
  m.marshallToJSON(obj, writer);
于 2011-02-04T10:53:44.313 に答える
2

実際には、CXF を使用しているだけでなく、Jackson の json シリアライゼーションも使用していないようです。なんで?Jackson は、属性として宣言されたものの前に「@」を追加しないためです。

ObjectMapper を使用したい場合は、おそらくデフォルトから開始し、変更したい内容に応じて変更を試みることをお勧めします。一連の構成オーバーライドから開始するのではありません (たとえば、getter/setter の自動検出を無効にしています)。 、これはあなたがすべきことのようには見えません)。

于 2011-02-05T06:15:03.767 に答える
0

はい。http://cxf.apache.org/docs/jax-rs-data-bindings.htmlのように Jackson をプロバイダーとして設定できます 。私は、Jackson が多くの点でシンプルで便利であることを観察してきました。

于 2012-03-12T17:21:46.360 に答える