Jojje
Jojje

Reputation: 1779

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

}

Upvotes: 49

Views: 93769

Answers (7)

Vinod Joshi
Vinod Joshi

Reputation: 7852

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

Upvotes: -1

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

Upvotes: 2

Dmitri
Dmitri

Reputation: 9157

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")

Upvotes: 102

K.Alianne
K.Alianne

Reputation: 1

You can also try this :

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

Upvotes: 0

alexcornejo
alexcornejo

Reputation: 163

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

Upvotes: 6

Prem Kumar
Prem Kumar

Reputation: 51

responseMessage is bean class in which we can send UTF-8 charset in response.

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

Upvotes: 5

martin
martin

Reputation: 1328

If adding the charset to each and every resource is not an option, maybe the answer to this question, which shows how to enforce a default charset, might be helpful.

Upvotes: 5

Related Questions