веб-сервис-джерси кодировка JSON UTF-8 - PullRequest
44 голосов
/ 20 февраля 2012

Я сделал небольшой веб-сервис Rest, используя Jersey 1.11.Когда я вызываю URL, который возвращает Json, возникают проблемы с кодировкой символов для неанглийских символов.Соответствующий URL для Xml ("test.xml" делает его utf-8 в начальном xml-теге.

Как сделать так, чтобы URL "test.json" возвращал ответ в кодировке utf-8?

Вот код службы:

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

Это pojo, которое использует служба:

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 ]

94 голосов
/ 20 февраля 2012

Джерси всегда должен производить utf-8 по умолчанию, похоже, проблема в том, что ваш клиент не интерпретирует его правильно (объявление xml не «делает» его utf-8, просто говорит клиенту, как его анализировать)).

С каким клиентом вы сталкиваетесь с этими проблемами?

Действительный JSON должен быть только Unicode (utf-8/16/32);парсеры должны иметь возможность автоматически определять кодировку (конечно, некоторые этого не делают), поэтому в JSON нет объявления кодировки.

Вы можете добавить его к Content-Type, например так:

@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
5 голосов
/ 13 декабря 2013

Если добавить кодировку к каждому ресурсу невозможно, возможно, будет полезен ответ на этот вопрос , который показывает, как применять кодировку по умолчанию.

3 голосов
/ 19 мая 2016

если @Produces (MediaType.APPLICATION_JSON + "; charset = utf-8") не работает, попробуйте:

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

по идее то же самое, но первый вариант мне не сработал

3 голосов
/ 29 марта 2016

responseMessage - это класс бинов, в который мы можем отправить UTF-8 charset в ответ.

return Response.ok(responseMessage).header("Content-Type", "application/json;charset=UTF-8").build();
0 голосов
/ 19 сентября 2018

Я получил ту же проблему в сервлете

, пожалуйста, используйте: 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 голосов
/ 07 февраля 2018

Джерси глючит, когда используется приложение Content-Type / json, оно не обнаруживает кодировку JSON в юникоде автоматически, как это предполагается, но десериализует тело запроса с использованием любой кодировки платформы времени выполнения, используемой вашим сервером.То же самое относится и к сериализации тела ответа.

Вашему клиенту необходимо явно указать кодировку UTF-8:

Content-Type: application/json;charset=utf-8
0 голосов
/ 02 июля 2017

Вы также можете попробовать это:

return Response.ok(responseMessage, "application/json;charset=UTF-8").build();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...