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() {}
}
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")
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.
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();
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
vous pouvez aussi essayer ceci :
return Response.ok(responseMessage, "application/json;charset=UTF-8").build();
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
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