Сериализация JSON в Джерси - Как игнорировать XmlJavaTypeAdapter для сериализации карты? - PullRequest
3 голосов
/ 03 ноября 2011

В моем веб-сервисе REST на основе Джерси мне нужно предоставить вывод в формате xml и json. Класс Результат имеет карту, аннотированную XmlJavaTypeAdapter для правильной сериализации в xml.

@XmlRootElement
public class Result {

    private Map<String,Integer> results = new HashMap<String, Integer>();

    public Result(){}

    @XmlJavaTypeAdapter(ResultMapAdapter.class)
    public Map<String,SearchResult> getResults() {
        return results;
    }
}

Вывод XML выглядит следующим образом:

<results>
  <result><name>Key1</name><value>Value1</value>
  <result><name>Key2</name><value>Value2</value>
</results>

И вывод json выглядит как

  "result":[{
    "name": "Key1",
    "value": Value1
  },{
    "name": "Key2",
    "value": Value2
  }]

Но я хочу, чтобы это выглядело так:

  "result":{
    "Key1": Value1,
    "Key2": Value2
  }

Если я удалю аннотацию XMlRootElement и XmlJavaTypeAdapter, вывод json будет выглядеть так, как я хотел, но затем сериализация xml не удалась. Есть ли обходной путь?

1 Ответ

0 голосов
/ 04 ноября 2011

Одним из возможных решений является использование пользовательского ObjectMapperProvider. Следующий поставщик не создает комбинированный картограф для json и xml. Поэтому в сериализации json не используется аннотация xml.

Конечно, недостаток этого зол

@Provider
public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {

    final ObjectMapper defaultObjectMapper;

    public ObjectMapperProvider() {
        defaultObjectMapper = createDefaultMapper();
    }

    @Override
    public ObjectMapper getContext(Class<?> type) {

        return defaultObjectMapper;
    }


    private static ObjectMapper createDefaultMapper() {

        ObjectMapper result = new ObjectMapper();
        result.configure(Feature.INDENT_OUTPUT, true);

        return result;
    }
}
...