Jersey web service json utf-8 encoding - программирование
Подтвердить что ты не робот

Jersey web service json utf-8 encoding

Я сделал небольшой веб-сервис 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() {}

}
4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

@Produces ( "приложения/JSON; кодировка = UTF-8" )

в теории одно и то же, но первый вариант мне не помог

Ответ 5

Вы также можете попробовать следующее:

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