2015-10-19 11 views
1

Я пытаюсь достичь следующего XML:FasterXML сериализации без использования типа поля в XML

<model> 
    <entry> 
     <key>A</key> 
     <value>1</value> 
    </entry> 
    <entry> 
     <key>B</key> 
     <value>2</value> 
    </entry> 
</model> 

Ближайший POJO модель у меня есть, экспериментируя с моим кодом выглядит следующим образом:

import com.fasterxml.jackson.annotation.JsonRootName; 
import com.fasterxml.jackson.core.JsonProcessingException; 
import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.dataformat.xml.XmlMapper; 
import static com.google.common.collect.Lists.newArrayList; 
import java.util.ArrayList; 
import java.util.List; 
import static org.hamcrest.MatcherAssert.assertThat; 
import static org.hamcrest.Matchers.equalTo; 
import org.junit.Test; 

public class InsPersonFormTest { 

    @JsonRootName("model") 
    public static class Model extends ArrayList<Entry> { 

     public Model(List<Entry> entries) { super(entries); } 

     public List<Entry> getEntry() { return this; } 
    } 

    public static class Entry { 

     String key; 
     String value; 

     public Entry(String key, String value) { 
      this.key = key; 
      this.value = value; 
     } 

     public String getKey() { return key; } 

     public String getValue() { return value; }  
    } 

    @Test 
    public void shouldSendPostRequest() throws JsonProcessingException { 
     Model model = new Model(newArrayList(new Entry("A", "1"), new Entry("B", "2"))); 

     ObjectMapper xmlMapper = new XmlMapper(); 
     String xml = xmlMapper.writeValueAsString(model); 

     assertThat(xml, equalTo(
       "<model>" 
       + "<entry><key>A</key><value>1</value></entry>" 
       + "<entry><key>B</key><value>2</value></entry>" 
       + "</model>")); 
    } 
} 

Но это дает мне

ОЖИДАЕТСЯ:

"<model><entry><key>A</key><value>1</value></entry><entry><key>B</key><value>2</value></entry></model>"

но: был

"<model><item><key>A</key><value>1</value></item><item><key>B</key><value>2</value></item></model>"

Как я могу изменить item к entry или использовать Простейшая структуру POJO с более подходящим Map<String, String> поле?

ответ

1

Не делайте Model класс подтипом ArrayList. Вместо того, чтобы использовать состав

public static class Model { 
    private ArrayList<Entry> entry; 

    public Model(List<Entry> entries) { 
     entry = entries; // or make a copy 
    } 

    @JacksonXmlElementWrapper(useWrapping = false) 
    public List<Entry> getEntry() { 
     return entry 
    } 

} 

ArrayList является List и Джексон ручки List в управляемом пути.

Вам нужно будет добавить JacksonXmlElementWrapper, чтобы вы могли сказать, что Джексон не должен обернуть полученный XML.

Вы можете использовать

@JacksonXmlRootElement(/* custom */) 

аннотировать Entry и добавить локальное имя узла XML и значение пространства имен.

+0

Я сделал класс 'Model' для того, чтобы быть субтипом' ArrayList' из-за двойной упаковки в теге ''. Если бы я сделал все, что вам посоветовал, то, к сожалению, эта ситуация снова вернется. Вот выход: ' Б'. Как вы можете увидеть '' тег снова удваивается. – ytterrr

+0

@ytterrr Вы правы. Добавлено решение для этого. –

+0

'@ JacksonXmlElementWrapper' был ключевым аннотацией, чтобы заставить его работать. Спасибо. – ytterrr

-1

Вы пробовали аннотировать класс Entry?

@JsonRootName("entry") 
public static class Entry { 

    String key; 
    String value; 

    public Entry(String key, String value) { 
     this.key = key; 
     this.value = value; 
    } 

    public String getKey() { return key; } 

    public String getValue() { return value; }  
} 
+0

Благодарим за участие. Да, я попробовал - кажется, что '@JsonRootName (« entry »)' в этом случае не помогает. – ytterrr

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

  • Нет связанных вопросов^_^