2014-01-13 3 views
4

Я ищу лучшее решение для преобразования POJO или JSON в XML со всеми атрибутами в правильных местах. На данный момент Джексон выглядит наиболее удобным способом. Я могу сериализовать POJO в XML без атрибутов.Как конвертировать POJO в XML с помощью Jackson

POJO TestUser

public class TestUser extends JsonType 
{ 
    @JsonProperty("username") 
    private final String username; 
    @JsonProperty("fullname") 
    private final String fullname; 
    @JsonProperty("email") 
    private final String email; 
    @JsonProperty("enabled") 
    private final Boolean enabled; 

    @JsonCreator 
    public TestUser(
     @JsonProperty("username") String username, 
     @JsonProperty("fullname") String fullname, 
     @JsonProperty("email") String email, 
     @JsonProperty("enabled") Boolean enabled) 
     { 
      this.username = username; 
      this.fullname = fullname; 
      this.email = email; 
      this.enabled = enabled; 
     } 
     @JsonGetter("username") 
     public String getUsername() 
     { 
      return username; 
     } 
     @JsonGetter("fullname") 
     public String getFullname() 
     { 
      return fullname; 
     } 
     @JsonGetter("email") 
     public String getEmail() 
     { 
      return email; 
     } 
     @JsonGetter("enabled") 
     public Boolean getEnabled() 
     { 
      return enabled; 
     } 
    } 
} 

Вот код:

public void testJsonToXML() throws JsonParseException, JsonMappingException, IOException 
{ 
    String jsonInput = "{\"username\":\"FOO\",\"fullname\":\"FOO BAR\", \"email\":\"[email protected]\", \"enabled\":\"true\"}"; 

    ObjectMapper jsonMapper = new ObjectMapper(); 
    TestUser foo = jsonMapper.readValue(jsonInput, TestUser.class); 
    XmlMapper xmlMapper = new XmlMapper(); 
    System.out.println(xmlMapper.writer().with(SerializationFeature.WRAP_ROOT_VALUE).withRootName("product").writeValueAsString(foo)); 
} 

И теперь он возвращает этот

<TestUser xmlns=""> 
    <product> 
     <username>FOO</username> 
     <fullname>FOO BAR</fullname> 
     <email>[email protected]</email> 
     <enabled>true</enabled> 
    </product> 
</TestUser> 

Что приятно, но мне нужна переменная enabled быть атрибутом username, а затем мне нужно добавить xmlns и xsi атрибуты в корень элемент, так что результат XML выглядит следующим образом

<TestUser xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="testUser.xsd"> 
    <product> 
     <username enabled="true">FOO</username> 
     <fullname>FOO BAR</fullname> 
     <email>[email protected]</email> 
    </product> 
</TestUser> 

Я нашел несколько примеров использования @JacksonXmlProperty, но это только добавляет атрибут к корневому элементу.

Спасибо за помощь

+0

Какое полное имя пакета для 'JsonType', которое вы распространяете в своем« TestUser »? – Chaitanya

ответ

1

Интересная проблема: ввод дополнительных данных. В настоящее время нет никаких функций для этого; но я думаю, можно было бы добавить, скажем, новый атрибут в @JsonRootName (schema=URL?), что позволило бы добавить отображение схемы или сопоставление?

Я пошел вперед и подал это:

https://github.com/FasterXML/jackson-dataformat-xml/issues/90

добавить что-то, что должно работать; не стесняйтесь добавлять комментарии, предложения.

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