1
Я использую джерси Apache 2.2 и у меня есть следующие услуги сиденияjava.util.Map в выходе REST службы с использованием джерси
@GET
@Path("load3")
@Produces({ MediaType.APPLICATION_JSON })
@Consumes({ MediaType.APPLICATION_JSON })
public LocalizationContainer load3() {
Map<String, String> map = new HashMap<String, String>();
map.put("key1", "value1");
map.put("key2", "value2");
return new SampleContainer(map);
}
@XmlRootElement
общественного класс SampleContainer {
public SampleContainer(){
}
public SampleContainer(Map<String,String> map){
this.map = map;
}
@XmlJavaTypeAdapter(value = MapAdapter.class)
private Map<String, String> map = new HashMap<String, String>();
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
}
и MapAdapter определяется следующим образом:
public class MapAdapter extends XmlAdapter<MapAdapter.AdaptedMap, Map<String, String>> {
public static class AdaptedMap {
@XmlVariableNode("key")
List<AdaptedEntry> entries = new ArrayList<AdaptedEntry>();
}
public static class AdaptedEntry {
@XmlTransient
public String key;
@XmlValue
public String value;
}
@Override
public AdaptedMap marshal(Map<String, String> map) throws Exception {
AdaptedMap adaptedMap = new AdaptedMap();
for (Entry<String, String> entry : map.entrySet()) {
AdaptedEntry adaptedEntry = new AdaptedEntry();
adaptedEntry.key = entry.getKey();
adaptedEntry.value = entry.getValue();
adaptedMap.entries.add(adaptedEntry);
}
return adaptedMap;
}
@Override
public Map<String, String> unmarshal(AdaptedMap adaptedMap) throws Exception {
List<AdaptedEntry> entries = adaptedMap.entries;
Map<String, String> map = new HashMap<String, String>(entries.size());
for (AdaptedEntry adaptedEntry : entries) {
map.put(adaptedEntry.key, adaptedEntry.value);
}
return map;
}
}
выход службы покоя является
{"map":{"key2":"value2","key1":"value1"}}
, но я не хочу, чтобы корневой элемент. Мой ожидаемый результат:
{"key2":"value2","key1":"value1"}
Что для меня? Возможно ли это?
большое спасибо
Какой десериализатор вы используете? Я предлагаю вам использовать Джексона. У Jackson есть проблема mo 'с' '' '' '' '' '' '' '' 'и если вы _really_ хотите сохранить класс-оболочку (на самом деле не видите, почему), вы можете поместить' @ JsonAnyGetter' в 'getMap' и не будет сериализовать свойство' map' , но вместо этого добавьте ключи карты в качестве свойств в 'SampleContainer' –
@peeskillet. Вы имеете в виду, что я могу вернуть Карту без использования класса-оболочки? Является ли это возможным ? Если я вернусь на java.util.Map, я получил ошибку от трикотажа. –
Вот почему я спросил, какой сериализатор вы используете. Если вы используете MOXy, это не выход. Если вы используете Джексон, он должен работать нормально –