web-dev-qa-db-fra.com

Jackson ajoute une barre oblique inverse dans JSON

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?

15
François Esthète

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;
    }
  }
1
Deepraj jha

Cela ne devrait pas être un problème, il vous suffit de l'analyser en javascript et de l'utiliser: JSON.parse (réponse)

0
Sujan

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 ceci
JSONArray users = new JSONArray(); for (Collection user : usersCollection) { JSONObject user = new JSONObject(mapper.writeValueAsString(user)); users.put(user); } mapper.writeValueAsString(user));

0
Bahadar Ali