web-dev-qa-db-fra.com

service web jersey encodage json utf-8

J'ai créé un petit service Web Rest avec Jersey 1.11. Lorsque j'appelle l'URL qui renvoie Json, il y a des problèmes avec l'encodage des caractères pour les caractères non anglais. L'URL correspondante pour XML ("test.xml" le rend utf-8 dans la balise xml de départ.

Comment faire en sorte que l'URL "test.json" renvoie la réponse encodée en utf-8?

Voici le code pour le service:

@Stateless
@Path("/")
public class RestTest {   
    @EJB
    private MyDao myDao;

    @Path("test.xml/")
    @GET
    @Produces(MediaType.APPLICATION_XML )
    public List<Profile> getProfiles() {    
        return myDao.getProfilesForWeb();
    }

    @Path("test.json/")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<Profile> getProfilesAsJson() {
        return myDao.getProfilesForWeb();
    }
}

C'est le pojo utilisé par le service:

package se.kc.mimee.profile.model;

@XmlRootElement
public class Profile {
    public int id;
    public String name;

    public Profile(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public Profile() {}

}
43
Jojje

Jersey devrait toujours produire par défaut utf-8. Le problème vient du fait que votre client ne l’interprète pas correctement (la déclaration xml ne "rend" pas cela "utf-8, elle indique simplement au client comment l’analyser).

Avec quel client voyez-vous ces problèmes?

JSON valide est supposé être uniquement Unicode (utf-8/16/32); les analyseurs devraient pouvoir détecter le codage automatiquement (bien sûr, certains ne le font pas), il n'y a donc pas de déclaration de codage en JSON.

Vous pouvez l'ajouter au Content-Type comme suit:

@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
92
Dmitri

Si l'ajout du jeu de caractères à chaque ressource n'est pas une option, peut-être que la réponse à cette question , qui montre comment appliquer un jeu de caractères par défaut, peut être utile.

5
martin

responseMessage est une classe de beans dans laquelle nous pouvons envoyer UTF-8 charset en réponse.

return Response.ok(responseMessage).header("Content-Type", "application/json;charset=UTF-8").build();
3
Prem Kumar

si @Produces (MediaType.APPLICATION_JSON + "; charset = utf-8") ne fonctionne pas, essayez alors: 

@Produces ("application/json; charset = utf-8")

en théorie c'est pareil, mais la première option ne m'a pas fonctionné

3
JACA

Vous pouvez aussi essayer ceci: 

return Response.ok(responseMessage, "application/json;charset=UTF-8").build();
0
K.Alianne

Jersey est défectueux. Lorsque Content-Type application/json est utilisé, il ne détecte pas le codage JSON unicode automatiquement comme il le suppose, mais désérialise le corps de la requête avec le codage de la plate-forme d'exécution utilisé par votre serveur. Il en va de même pour la sérialisation du corps de la réponse.

Votre client doit spécifier explicitement le jeu de caractères UTF-8:

Content-Type: application/json;charset=utf-8
0
Dušan Zahoranský