2012-05-17 12 views
12

Apache CXFとJacksonの上で実行されるJAX-RS RESTサービスのセット全体があります。 POJOをJSONにマーシャリングするためにJAXBアノテーションを使用しています。ジャーナル経由でraw JSONを渡すには?

ただし、私たちは未処理のJSON文字列(Redisキャッシュから取得したもの)を返す場所が1つまたは2つあります。

ジャクソンは常に文字列を二重引用符で囲み、すべての二重引用符をエスケープします(例:

@GET @Produces("application/json") 
public Response getData() { 

    String json = ...get from Redis... 
    return Response.ok(json,"application/json").build() 
} 

は私たちに、オブジェクトマッパーにRawSerializer(String.class)を追加

"{\"test\":1}" 

の代わりに、私は複数のものを試してみた

{"test":1} 

を与え、何も機能しません。働く唯一の事は、私はジャクソンをバイパスし、プレーン文字列にメディアタイプを設定している場合ですが、私は悪い

return Response.ok(json,"text/plain").build() 

作品が、(すなわち、間違ったコンテンツタイプ

を返しておりますので、良いではありません間違ったコンテンツタイプは、私たちに電話する.Net WCFアプリケーション)

+0

代わりにMapを使用してJerseyに正しく解析させる必要がありました。mapper.setVisibility(PropertyAccessor.FIELD、Visibility.ANY)でJacksonJsonProviderを追加しました。 –

答えて

0

ObjectMapperは機能していませんか?ただ次のようになります。このような場合には

ObjectMapper mapper = new ObjectMapper() 
MyObj obj = MyObj(); 
...set values... 
String jsonRes = mapper.writeValueAsString(obj); 
return Response.ok(jsonRes, MediaType.APPLICATION_JSON).build(); 
+0

それはまだそれをどこかに変換し、その文字列はレスポンスでエスケープされます。 –

0

、あなたの最善の策は、問題はジャクソンではないので、Stringの戻り値の型を使用することです - その仕事のオブジェクトのうち、JSONを生成することであるとして、文字列を渡しませんJAX-RSはジャクソンに電話をかけない。ジャクソンがサポートするデフォルトのJSONプロバイダは、何も処理することなく、Stringの値をそのまま渡します(byte[]の場合も同じです)。

実際にJsonGenerator.writeRaw()メソッドもあります。これはリテラルテキストをOutputStreamに埋め込むことができますが、JAX-RS実装では低レベルの抽象クラスではなくObjectMapperを使用します。

+0

動作しません。 Stringを返すと、Jacksonはまだそれをエスケープします。 "{\"テスト\ ":1}" –

+0

どのバージョンですか? 2.0.2はこのように動作するはずです(ここでは2.0.0の不具合があります)。 1.9.xと同様です。 – StaxMan

10

最後に溶液を見いだした。トリックは(私たちはジャクソン代わりの投棄を使用することを強制するためにCXFで使用)JacksonJsonProviderを拡張し、生の文字列を扱うときに完全にジャクソンをバイパスすることを教えていた:

public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType){ 
    if (String.class.equals(type)) { 
     //pass strings as-is, they are most likely cached JSON responses 
     return false; 
    } else { 
     return true; 
    } 
} 
完璧に動作

+0

私は今同じ問題に直面しています...問題を解決したJacksonJsonProviderの例を教えてください。 –

+0

どこに追加すればいいですか?私は自分のプロバイダを登録しましたが、まだ作業していません... 12月14、2013 8:49:11 AM com.sun.jersey.api.core.ScanningResourceConfig logClasses INFO:プロバイダクラスが見つかりました: class com.wordnik.swagger。 jersey.listing。JerseyApiDeclarationProvider class com.tools.web.handler.JacksonJsonProvider –

関連する問題