2013-05-17 3 views
6

Używam JAXB marszałek uwagami obiektu XML w postaci:XML owinięty listę JSON tablicy poprzez odrzucić i JAXB

<channels> 
    <channel>Test A</channel> 
    <channel>Test B</channel> 
    </channels> 

chcę zebrać to JSON zamiast przy użyciu JAXB (ala http://blog.bdoughan.com/2011/04/jaxb-and-json-via-jettison.html) ale marszałków do czegoś tak:

"channels" : { 
    "channel" : [ "Test A", "Test B" ] 
    }, 

Naprawdę chcę, żeby zebrać w następującej formie:

"channels" : { 
    {"Test A"}, {"Test B"} 
    }, 

Jak mogę to zrobić? Czy to jest właściwe?

+1

Czy wolałbyś raczej: '" kanały ": [" Test A "," Test B "]'? –

Odpowiedz

4

Uwaga: Jestem EclipseLink JAXB (MOXy) ołowiu i członkiem grupy JAXB 2 (JSR-222) ekspertów.

Poniżej przedstawiono sposób obsługi tego przypadku użycia za pomocą powiązania JSON w EclipseLink JAXB (MOXy).

Java model (korzeń)

Poniżej jest model Java, która będzie używać do tego przykładu.

import java.util.*; 
import javax.xml.bind.annotation.*; 

@XmlRootElement 
public class Root { 

    private List<String> channels = new ArrayList<String>(); 

    @XmlElementWrapper 
    @XmlElement(name="channel") 
    public List<String> getChannels() { 
     return channels; 
    } 

} 

Określ Moxy jako dostawca JAXB (jaxb.properties)

Aby określić Moxy jako dostawcę JAXB trzeba dołączyć plik o nazwie jaxb.properties w tym samym opakowaniu jak model domeny z następujących wejście (patrz:):

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 

Code Demo

W poniższym kodzie demonstracyjnym będziemy wyprowadzać to samo wystąpienie zarówno do XML, jak i do JSON.

import javax.xml.bind.*; 
import org.eclipse.persistence.jaxb.MarshallerProperties; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Root.class); 
     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 

     Root root = new Root(); 
     root.getChannels().add("Test A"); 
     root.getChannels().add("Test B"); 

     // Output XML 
     marshaller.marshal(root, System.out); 

     // Output JSON 
     marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json"); 
     marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false); 
     marshaller.setProperty(MarshallerProperties.JSON_WRAPPER_AS_ARRAY_NAME, true); 
     marshaller.marshal(root, System.out); 
    } 

} 

Wyjście

Poniżej jest wyjście z uruchomieniem kodu Demo:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <channels> 
     <channel>Test A</channel> 
     <channel>Test B</channel> 
    </channels> 
</root> 
{ 
    "channels" : [ "Test A", "Test B" ] 
} 

Aby uzyskać więcej informacji

0

Najprostszym sposobem jest prawdopodobnie zamiana modelu JAXB na dostosowany model JSON.

Można by wtedy zrobić:

  1. instancji modelu JAXB
  2. przekonwertować go do modelu JSON
  3. Marszałka modelu JSON

zależności od sposobu instancji modelu JAXB, możesz zamiast tego bezpośrednio utworzyć instancję modelu JSON.

+1

Czy możesz podać prosty przykład tego? – James