wake-up-neo.com

jersey-Webdienst json utf-8-Kodierung

Ich habe einen kleinen Rest Webservice mit Jersey 1.11 erstellt. Wenn ich die URL anrufe, die Json zurückgibt, gibt es Probleme mit der Zeichencodierung für nicht englische Zeichen. Die entsprechende URL für Xml ("test.xml") macht es utf-8 im Start-XML-Tag.

Wie kann ich veranlassen, dass die URL "test.json" eine utf-8-codierte Antwort zurückgibt?

Hier ist der Code für den Dienst:

@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();
    }
}

Dies ist der Pojo, den der Dienst verwendet:

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 sollte standardmäßig immer utf-8 erstellen. Das Problem ist, dass der Client dies nicht richtig interpretiert (die XML-Deklaration "utf-8" macht es nicht "utf-8"), sondern teilt dem Client mit, wie er analysiert werden muss.

Mit welchem ​​Kunden sehen Sie diese Probleme?

Gültiges JSON soll nur Unicode sein (utf-8/16/32); Parser sollten in der Lage sein, die Kodierung automatisch zu erkennen (natürlich tun es einige nicht), daher gibt es in JSON keine Kodierungsdeklaration.

Sie können es wie folgt zum Content-Type hinzufügen:

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

Wenn das Hinzufügen des Zeichensatzes zu jeder Ressource keine Option ist, kann die Antwort auf this question , die zeigt, wie ein Standardzeichensatz erzwungen wird, hilfreich sein.

5
martin

responseMessage ist die Bean-Klasse, in der wir als Antwort UTF-8 charset senden können.

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

wenn @Produces (MediaType.APPLICATION_JSON + "; charset = utf-8") nicht funktioniert, versuchen Sie Folgendes: 

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

theoretisch ist es das Gleiche, aber die erste Option hat für mich nicht funktioniert

3
JACA

Sie können dies auch versuchen: 

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

Jersey ist fehlerhaft. Wenn Content-Type application/json verwendet wird, erkennt es die Unicode-JSON-Kodierung nicht automatisch wie erwartet, deserialisiert jedoch den Anforderungstext mit der von Ihrem Server verwendeten Laufzeitplattformkodierung. Gleiches gilt für die Antwortkörperserialisierung.

Ihr Client muss den UTF-8-Zeichensatz explizit angeben:

Content-Type: application/json;charset=utf-8
0