14

Apache CXF と Jackson の上で実行される一連の JAX-RS REST サービスがあります。JAXB アノテーションを使用して、POJO を JSON にマーシャリングします。うまく機能します。

ただし、生の JSON 文字列 (Redis キャッシュからフェッチする) を返したい場所が 1 つか 2 つあります。

Jackson は常に文字列を二重引用符で囲み、その中のすべての二重引用符をエスケープします。

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

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

私たちに与える

"{\"test\":1}"

それ以外の

{"test":1}

オブジェクトマッパーに RawSerializer(String.class) を追加して、複数のことを試しましたが、何も機能しません。機能する唯一のことは、メディアタイプをJacksonをバイパスするプレーンストリングに設定した場合ですが、間違ったコンテンツタイプを返すため、良くありません

すなわち

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

動作しますが、不十分です (間違ったコンテンツ タイプ、私たちを呼び出す .Net WCF アプリを台無しにします)

4

3 に答える 3

10

ついに解決策を見つけました。秘訣は、JacksonJsonProvider(CXFでJettisonの代わりにJacksonを使用するように強制するために使用)を拡張し、生の文字列を処理するときにJacksonを完全にバイパスするように指示することでした。

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;
    }
}

完璧に動作します。

于 2012-05-18T13:26:42.533 に答える
0

Stringこのような場合、問題はジャクソンではなく、オブジェクトからJSONを生成し、文字列をそのまま渡すのではなく、呼び出しないJAX-RSであるため、 の戻り値の型を使用するのが最善の策です。ジャクソン。デフォルトの Jackson が支援する JSON プロバイダーは、何も処理せずStringに値をそのまま ( については同上) 渡します。byte[]

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

于 2012-05-18T03:57:12.437 に答える
0

ObjectMapper が機能していませんか? 次のようにする必要があります。

ObjectMapper mapper = new ObjectMapper()
MyObj obj = MyObj();
...set values...
String jsonRes = mapper.writeValueAsString(obj);
return Response.ok(jsonRes, MediaType.APPLICATION_JSON).build();
于 2012-05-17T20:55:32.057 に答える