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
はテスト結果です。私の問題を修正するためのアイデアはありますか?
これを行う。
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;
}
}
問題にはなりません。JavaScriptで解析して使用するだけです。JSON.parse(response)
私も同じ問題を抱えており、別の解決策を試しましたが、うまくいきません。問題はマッパーではなく、マッパーへの入力にあります。あなたの場合のように: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));