2015-10-23 3 views
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"} 

Что для меня? Возможно ли это?

большое спасибо

+1

Какой десериализатор вы используете? Я предлагаю вам использовать Джексона. У Jackson есть проблема mo 'с' '' '' '' '' '' '' '' 'и если вы _really_ хотите сохранить класс-оболочку (на самом деле не видите, почему), вы можете поместить' @ JsonAnyGetter' в 'getMap' и не будет сериализовать свойство' map' , но вместо этого добавьте ключи карты в качестве свойств в 'SampleContainer' –

+0

@peeskillet. Вы имеете в виду, что я могу вернуть Карту без использования класса-оболочки? Является ли это возможным ? Если я вернусь на java.util.Map, я получил ошибку от трикотажа. –

+0

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

ответ

0

Я решил с помощью @XmlPath аннотации.

Таким образом:

@XmlJavaTypeAdapter(value = MapAdapter.class) 
@XmlPath(".") 
private Map<String, String> map = new HashMap<String, String>(); 

карты сериализовать в самом формате JSON без "карты" ссылки.

Смежные вопросы