简体   繁体   中英

jersey web service json utf-8 encoding

I made a small Rest webservice using Jersey 1.11. When i call the url that returns Json, there are problems with the character encoding for non english characters. The corresponding url for Xml ("test.xml" makes it utf-8 in the starting xml-tag.

How can I make the url "test.json" return utf-8 encoded response?

Here's the code for the 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();
    }
}

This is the pojo that the service uses:

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

}

Jersey should always produce utf-8 by default, sounds like the problem is that your client isn't interpreting it correctly (the xml declaration doesn't "make" it utf-8, just tells the client how to parse it).

What client are you seeing these problems with?

Valid JSON is only supposed to be Unicode (utf-8/16/32); parsers should be able to detect the encoding automatically (of course, some don't), so there is no encoding declaration in JSON.

You can add it to the Content-Type like so:

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

如果将charset添加到每个资源都不是一个选项,那么这个问题的答案(显示如何强制执行默认字符集)可能会有所帮助。

responseMessage是bean类,我们可以在其中发送UTF-8 charset作为响应。

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

if @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8") does not function, then try:

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

in theory it is the same, but the first option did not work to me

你也可以试试这个:

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

Jersey is buggy, when Content-Type application/json is used, it does not detect the unicode JSON encoding automatically as it suppose to, but deserialize the request body with whatever runtime platform encoding is used by you server. Same applies for the response body serialization.

Your client need to explicitly specify UTF-8 charset:

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

i got the same issue in servlet

kindly use : 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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM