Jerseyを使っているとレスポンス用のJSONの定義クラスに
アノテーションの@XmlTransitで省略したり
@XmlElement(name="element")で名前変更したりして
ObjectをJAXB経由でJSONに自動でパースさせてたりしますが
その定義を他でも使いまわして各々の処理でJSON文字列にパースする場合には
JacksonJAXBAnnotations
を利用すればいいです。
これは利用すればJAXBアノテーションを利用したマッピングが可能です。
mavenでpom.xmlに追加
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-xc</artifactId>
<version>1.9.13</version>
</dependency>
Javaでは次のようにするればobjをJSONにパース可能
例ではやってないけどObjectMapperはthread safeなので使いまわしましょう
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.ObjectWriter;
import org.codehaus.jackson.xc.JaxbAnnotationIntrospector;
…
JaxbAnnotationIntrospector introspector = new JaxbAnnotationIntrospector();
ObjectWriter ow = new ObjectMapper().setAnnotationIntrospector(introspector).writer()
.withDefaultPrettyPrinter();
String json = ow.writeValueAsString(obj);
最初は、jerseyの内部ロジックを利用しようとしましたが
ひとつのオブジェクトしかないリストがオブジェクトでパースされる問題が発生したり
いちいちクラスタイプ指定しないといけないので面倒でやめました
ちなみに 最初はこんなかんじにしてました
private Class[] types = {
MyClass.class,
ArrayList.class,
};
String result = null;
JSONConfiguration config = JSONConfiguration.natural().build();
JSONJAXBContext ctx = new JSONJAXBContext(config, types);
JSONMarshaller m = ctx.createJSONMarshaller();
StringWriter sw = new StringWriter();
m.marshallToJSON(xmlObj, sw);
result = sw.toString();
return result;
JAXBContextResolverと似たような感じですね
POJOMappingFeatureで問題はどうにかなるかと思ったんですが
JacksonJAXBAnnotationsを使ったほうが楽だし早い
0 件のコメント:
コメントを投稿