maillot de service web json l'encodage utf-8

j'ai fait un petit Rest webservice en utilisant Jersey 1.11. Quand j'appelle l'url qui renvoie Json, il y a des problèmes avec le codage des caractères pour les caractères non anglais. L'url correspondante pour Xml ("test.xml " le rend utf-8 dans la balise de départ xml.

Comment puis-je faire de l'url ".json" retour codé en utf-8 réponse?

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 que le service utilise:

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() {}

}
41
demandé sur Jojje 2012-02-20 14:38:03

7 réponses

Jersey devrait toujours produire utf-8 par défaut, on dirait que le problème est que votre client ne l'interprète pas correctement (la déclaration xml ne "fait" pas utf-8, dit juste au client comment le parser).

avec quel client voyez-vous ces problèmes?

JSON Valide est supposé être en Unicode (utf-8/16/32); les outils d'analyse devraient être en mesure de détecter l'encodage automatiquement (bien sûr, certains ne le font pas), alors il n'y a pas de codage déclaration à JSON.

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

@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
90
répondu Dmitri 2017-11-10 22:17:26

Si ajouter le 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, pourrait être utile.

5
répondu martin 2017-05-23 12:10:30

responseMessage est la classe de haricots 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
répondu Prem Kumar 2016-03-29 05:57:30

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

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

en théorie c'est la même, mais la première option ne fonctionne pas pour moi

3
répondu JACA 2016-05-19 05:27:29

vous pouvez aussi essayer ceci :

return Response.ok(responseMessage, "application/json;charset=UTF-8").build();
0
répondu K.Alianne 2017-07-01 21:37:12

Jersey est bogué, quand application de type de contenu/json est utilisé, il ne détecte pas l'encodage JSON unicode automatiquement comme il le suppose, mais désérialise le corps de requête avec n'importe quel encodage de plate-forme d'exécution est utilisé par votre serveur. Il en va de même pour la sérialisation du corps de réponse.

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

Content-Type: application/json;charset=utf-8
0
répondu Dušan Zahoranský 2018-02-07 01:41:05

j'ai eu le même problème dans le servlet

utilisation: resp.setContentType ("application/json;charset=utf-8");

public static void flashOutput(HttpServletRequest req
            , HttpServletResponse resp
            , String output) {

        try {

            Utils.print2("output flash"+output);

            resp.setContentType("application/json;charset=utf-8");
            PrintWriter pw = resp.getWriter();
            pw.write( new String(output.getBytes("UTF-8")));
            pw.close();
            resp.flushBuffer();

        } catch (Exception e) {
            // TODO: handle exception
        }

    }// end flashOutput
0
répondu Vinod Joshi 2018-09-19 07:33:27