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() {}
}
Ответы
Ответ 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();