web-dev-qa-db-ja.com

ジャクソンはjsonにバックスラッシュを追加します

REST Jerseyのサービスを構築し、Jacksonを使用して、モデルのJavaクラスからJSONを生成します。モデル絶対に単純な値では、これが最も典型的なケースだと思いますが、奇妙な結果が得られます:

[{\"name\":\"Nick\",\"role\":\"admin\",\"age\":\"32\",\"rating\":47}]

私の期待する結果:

[{"name":"Nick","role":"admin","age":"32","rating":47}]

フィールドのソース値に特殊文字が含まれていません。これらは単純な言葉です。

私のJavaクラスがあります。エンティティ:

public class User {

  private String name;

  private String role;

  private String age;

  private Integer rating;

休憩サービスのクラス:

@ServiceConfig(contextName = "myContext")
@Path("/myrest")
public class MyRestService {

  private static final String JSON_CONTENT_TYPE = MediaType.APPLICATION_JSON + ";charset=UTF-8";

  @Context
  protected HttpServletResponse response;

  @GET
  @Path("/users")
  @OpenTransaction
  @Produces({MediaType.APPLICATION_JSON})
  public String findUsers(@QueryParam("department") String department) {

    response.setContentType(JSON_CONTENT_TYPE);
    PDTResponse.status(response).sendStatus(Response.Status.OK.getStatusCode());

    List<User> users = new ArrayList<>();
    users.add(new User("Nick", "admin", "32", 47));

    String jsonInString;
    ObjectMapper mapper = new ObjectMapper();
    try {
        jsonInString = mapper.writeValueAsString(users);
    } catch (JsonProcessingException ex) {
        jsonInString = "thrown exception: " + ex.getMessage();
    }
    return jsonInString;
}

アノテーションを使用しようとしました@JsonRawValue(文字列プロパティの場合):

@JsonRawValue
private String name;

しかし、この場合の結果は次のとおりです。

[{\"name\":Nick,\"role\":admin,\"age\":32,\"rating\":47}]

そして私は期待します:

[{"name":"Nick","role":"admin","age":"32","rating":47}]

応答の結果jsonで、ジャクソンが何らかの形で引用符をエスケープしていることは明らかです。しかし、なぜそれを行うのか、そして最も重要なのはそれを避ける方法ですか?それ自体は単なるストリングです!引用符や特殊文字なし。

私が使う Java 7およびJackson 2.6.1。そしてPostmanはテスト結果です。私の問題を修正するためのアイデアはありますか?

15

これを行う。

ObjectMapper mapper = new ObjectMapper();
mapper.getFactory().setCharacterEscapes(new JsonUtil().new CustomCharacterEscapes());
ObjectWriter writer = mapper.writer();

String jsonDataObject = mapper.writeValueAsString(configMap);       

public class CustomCharacterEscapes extends CharacterEscapes {

private final int[] _asciiEscapes;

    public CustomCharacterEscapes() {
       _asciiEscapes = standardAsciiEscapesForJSON();
       //By default the ascii Escape table in jackson has " added as escape string
       //overwriting that here.
       _asciiEscapes['"'] = CharacterEscapes.ESCAPE_NONE;
     }

     @Override
     public int[] getEscapeCodesForAscii() {
       return _asciiEscapes;
     }

     @Override
     public SerializableString getEscapeSequence(int i) {
       return null;
    }
  }
1
Deepraj jha

問題にはなりません。JavaScriptで解析して使用するだけです。JSON.parse(response)

0
Sujan

私も同じ問題を抱えており、別の解決策を試しましたが、うまくいきません。問題はマッパーではなく、マッパーへの入力にあります。あなたの場合のように:
jsonInString = mapper.writeValueAsString(users);
'users'はコレクションです。各ユーザーをJSONObjectに変換し、JSONArrayに追加して、配列のマッパーを使用する必要があります:次のようにします
JSONArray users = new JSONArray(); for (Collection user : usersCollection) { JSONObject user = new JSONObject(mapper.writeValueAsString(user)); users.put(user); } mapper.writeValueAsString(user));

0
Bahadar Ali