Je construis REST service sur Jersey
et j'utilise Jackson
pour produire du JSON à partir de Java classes de mon modèle. Model avec des valeurs absolument simples, je pense que c'est le cas le plus typique. Mais j'obtiens un résultat étrange:
[{\"name\":\"Nick\",\"role\":\"admin\",\"age\":\"32\",\"rating\":47}]
Mon résultat attendu:
[{"name":"Nick","role":"admin","age":"32","rating":47}]
Mes valeurs source de champs ne contiennent PAS de caractères spéciaux. Ce sont des mots simples.
Il y a mes Java. Entité:
public class User {
private String name;
private String role;
private String age;
private Integer rating;
Classe de service de repos:
@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;
}
J'ai essayé d'utiliser l'annotation @JsonRawValue
pour les propriétés de chaîne:
@JsonRawValue
private String name;
Mais le résultat dans ce cas était:
[{\"name\":Nick,\"role\":admin,\"age\":32,\"rating\":47}]
Et j'attends:
[{"name":"Nick","role":"admin","age":"32","rating":47}]
Il est évident que Jackson échappe en quelque sorte aux citations en résultat json de réponse. Mais pourquoi le fait-il, et surtout comment l'éviter? En soi, ce ne sont que des cordes! Sans guillemets ni caractères spéciaux.
J'utilise Java 7
et Jackson 2.6.1
. Et Postman
pour tester le résultat. Des idées pour résoudre mon problème?
Faites ça.
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;
}
}
Cela ne devrait pas être un problème, il vous suffit de l'analyser en javascript et de l'utiliser: JSON.parse (réponse)
J'ai également le même problème et essayé différentes solutions, mais ne fonctionne pas. Le problème n'est pas avec le mappeur, mais avec l'entrée du mappeur. Comme dans votre cas:jsonInString = mapper.writeValueAsString(users);
'utilisateurs' est une collection. Vous devez convertir chaque utilisateur en JSONObject
, l'ajouter à JSONArray
puis utiliser le mappeur sur le tableau: comme ceciJSONArray users = new JSONArray(); for (Collection user : usersCollection) { JSONObject user = new JSONObject(mapper.writeValueAsString(user)); users.put(user); } mapper.writeValueAsString(user));