JAX-RS, Map <String, String> в JSON без накладных расходов? - PullRequest
7 голосов
/ 14 декабря 2009

Я использую JAX-RS для создания спокойных веб-сервисов на Java. Я получаю много накладных расходов в производимом JSON.

Класс данных:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Test {

    private Map<String,String> data;

    Test() {}

    public Test(Map<String,String> data) {
        this.data = data;
    }

    public Map<String, String> getData() {
        return data;
    }
}

Услуги:

@GET
@Path("/test")
@Produces("application/json; charset=UTF-8;")
public Test test() {
   Map<String,String> map = new HashMap<String,String>();
   map.put("foo", "bar");
   map.put("bingo", "bongo");
   return new Test(map);
}

Производит:

{"data":{"entry":[{"key":"foo","value":"bar"},{"key":"bingo","value":"bongo"}]}}

Я бы хотел, чтобы он произвел:

{"data":{"foo":"bar","bingo":"bongo"}}

Какой самый простой способ добиться этого? Я могу переопределить свой класс данных, но заранее не знаю ключей или размера карты.

Ответы [ 3 ]

5 голосов
/ 14 декабря 2009

Простейшим способом было бы использовать List<Pair> вместо этого, где Pair - это просто Javabean с двумя свойствами.

1 голос
/ 30 ноября 2012

Если вы используете не аннотированные объекты JAXB, а простые POJO, вы можете получить правильное поведение, просто включив функцию отображения POJO вместе с библиотекой JSON Jackson.

Так что в web.xml, если вы используете фильтр (аналогично сервлету), ваша конфигурация должна быть:

<filter>
  <filter-name>Jersey</filter-name>
  <filter-class>...</filter-class>
  <init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
  </init-param>
</filter>

И просто зависит от зависимости jersey-json в вашей конфигурации maven или загрузите ее с веб-сайта и поместите Джексона в путь к классам. См. Также этот ответ и этот ответ и это сообщение в блоге . И почему на земле это не стандартное поведение, я не знаю.

1 голос
/ 26 января 2010

"Спецификация JAXB определяет специальную обработку для Map, когда она используется как свойство компонента."

В свете этого я не думаю, что вы можете многое сделать (в настоящее время), за исключением, возможно, написания собственного MessageBodyWriter (https://jsr311.dev.java.net/nonav/javadoc/javax/ws/rs/ext/MessageBodyWriter.html)

)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...