2009-02-18 16 views

Odpowiedz

14

Nie Java, ale czystym XSLT 2.0 realizacja:

Wystarczy popatrzeć na f:json-document() z FXSL 2.x library.

Za pomocą tej funkcji niezwykle łatwo jest włączyć JSon i używać go tak samo jak ... XML.

Na przykład, można po prostu napisać następujące wyrażenie XPath:

f:json-document($vstrParam)/Students/*[sex = 'Female'] 

i uzyskać wszystkie dzieci Students z sex = 'Female'

Oto pełna przykład:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:f="http://fxsl.sf.net/" 
exclude-result-prefixes="f xs" 
> 
<xsl:import href="../f/func-json-document.xsl"/> 

<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:variable name="vstrParam" as="xs:string"> 
{ 

    "teacher":{ 
    "name": 
     "Mr Borat", 
    "age": 
     "35", 
    "Nationality": 
     "Kazakhstan" 
      }, 


    "Class":{ 
    "Semester": 
     "Summer", 
    "Room": 
     null, 
    "Subject": 
     "Politics", 
    "Notes": 
     "We're happy, you happy?" 
      }, 

    "Students": 
    { 
     "Smith": 
     {"First Name":"Mary","sex":"Female"}, 
     "Brown": 
     {"First Name":"John","sex":"Male"}, 
     "Jackson": 
     {"First Name":"Jackie","sex":"Female"} 
    } 
    , 


    "Grades": 

    { 
     "Test": 
     [ 
     {"grade":"A","points":68,"grade":"B","points":25,"grade":"C","points":15}, 

     {"grade":"C","points":2, "grade":"B","points":29, "grade":"A","points":55}, 

     {"grade":"C","points":2, "grade":"A","points":72, "grade":"A","points":65} 
     ] 
    } 


} 
</xsl:variable> 

<xsl:template match="/"> 
    <xsl:sequence select= 
    "f:json-document($vstrParam)/Students/*[sex = 'Female']"/> 

</xsl:template> 
</xsl:stylesheet> 

Gdy powyższe transformacji jest stosowane na dowolnym dokumencie XML (ignorowane), poprawnym wynikiem jest produkowany:

<Smith> 
    <First_Name>Mary</First_Name> 
    <sex>Female</sex> 
</Smith> 
<Jackson> 
    <First_Name>Jackie</First_Name> 
    <sex>Female</sex> 
</Jackson> 
+0

wygląda świetnie. Ale próbowałem i f: json-document() zawsze zwraca pusty dokument. Opublikowalem o tym na forum SF.net: https://sourceforge.net/forum/message.php?msg_id=7385342 – avernet

+0

Istnieje przykład jak korzystać z tej funkcji. Jest to plik testFunc-json-document.xsl w folderze Tests: http://fxsl.cvs.sourceforge.net/viewvc/fxsl/fxsl-xslt2/Tests/testFunc-json-document.xsl?revision= 1.1 i widok = znaczniki Po zastosowaniu na dowolnym pliku XML (nieużywany) ta transformacja daje prawidłowy wynik. Jednym z potencjalnych czynników, który może spowodować twój problem, jest użycie stosunkowo starej wersji Saxona - skorzystaj z wersji Saxona 9.x. Również link w wiadomości jest nieosiągalny. –

0

Można użyć json-lib, zapewnia konwersję dwukierunkową.

3

Jeszcze jedna możliwość: Jettison, http://jettison.codehaus.org może narazić JSON za pośrednictwem interfejsu XML dekodowaniu (Stax XMLStreamReader), która umożliwia integracja z systemami, które rozumieją tylko XML. Wymaga to użycia konwencji (borsuka lub cokolwiek innego, jak się nazywał).

XStream, na przykład, wykorzystuje konwencję Jettison (lub przynajmniej Badgerfish), aby umożliwić użycie JSON.

Ale samo pytanie jest trochę niejasne: podczas gdy zawsze można przejść z jednego na drugie (naprawdę jest to bardzo banalne), XML i JSON nie są równoważne: nie ma jednego do jednego bezstratnego generyczne mapowanie. W związku z tym pytanie brzmi: co zamierzasz zrobić z wynikami, w jaki sposób należy użyć xml?

2

http://json-lib.sourceforge.net/

  • powyższych punktów o nie całkowicie niezawodny jeden-jeden mapowania są ważne, ale miałem dobre doświadczenia z konwersji XML do JSON przy użyciu powyższej biblioteki.
25

Można utworzyć JSONObject, a następnie przekonwertować go do formatu XML za pomocą XML class w org.json nazw

Owijanie ciąg json w obiekcie jest tak proste jak przepuszczenie go w jego konstruktora

JSONObject o = new JSONObject(jsonString); 

Wtedy można go pobrać w formacie XML za pomocą klasy XML, tak jak poniżej:

String xml = org.json.XML.toString(o); 
+6

To jest niezwykle proste, dziękuję! – Jon

+0

Czy możesz rozwinąć? To znaczy czy muszę używać zewnętrznych słoików? Eclipse nie rozpozna tych poleceń –

+0

Możesz spróbować tego: http://mvnrepository.com/artifact/org.codeartisans/org.json/20130603 –

0

StAXON może konwertować JSON do XML przy użyciu XSLT z domyślnych szablonów lub Stax zdarzeń API https://github.com/beckchr/staxon/wiki/Converting-JSON-to-XML

Oto prosty przykład:

plik wejściowy:

{ 
    "container":[ 
     { 
      "someString":"xxxxx", 
      "someInteger":123, 
      "someArrayElem":[ 
       { 
        "key":1111, 
        "value":"One" 
       }, 
       { 
        "key":2222, 
        "value":"Two" 
       } 
      ] 
     } 
    ] 
} 

Import kod +:

import de.odysseus.staxon.json.JsonXMLConfig; 
import de.odysseus.staxon.json.JsonXMLConfigBuilder; 
import de.odysseus.staxon.json.JsonXMLInputFactory; 
import de.odysseus.staxon.xml.util.PrettyXMLEventWriter; 
import javax.xml.stream.XMLEventReader; 
import javax.xml.stream.XMLEventWriter; 
import javax.xml.stream.XMLOutputFactory; 
import java.io.StringWriter; 

StringWriter stringWriter = new StringWriter(); 
JsonXMLConfig config = new JsonXMLConfigBuilder().multiplePI(false).prettyPrint(false).build(); 
XMLEventReader reader = new JsonXMLInputFactory(config).createXMLEventReader(getClass().getClassLoader().getResourceAsStream("input.json")); 
XMLEventWriter writer = XMLOutputFactory.newInstance().createXMLEventWriter(stringWriter); 
writer = new PrettyXMLEventWriter(writer); 
writer.add(reader); 
String xml = stringWriter.getBuffer().toString(); 

WYJŚCIE :

<?xml version="1.0" encoding="UTF-8"?> 
<container> 
    <someString>xxxxx</someString> 
    <someInteger>123</someInteger> 
    <someArrayElem> 
     <key>1111</key> 
     <value>One</value> 
    </someArrayElem> 
    <someArrayElem> 
     <key>2222</key> 
     <value>Two</value> 
    </someArrayElem> 
</container> 
1

Conversion Box!!!

Używam JSON że Dimitre został wklejony w swojej odpowiedzi i zostały przekształcone XML. Pozwala sprawdzić, czy to działa dla Ciebie .....

import org.json.me.JSONObject; 

import cjm.component.cb.xml.ToXML; 

public class Test 
{ 
public static void main(String[] args) 
{ 
    try 
    { 
     JSONObject objectJSON = new JSONObject(); 

     objectJSON.put("ROOT", (new JSONObject("{\"teacher\":{\"name\":\"Mr Borat\",\"age\":\"35\",\"Nationality\":\"Kazakhstan\"},\"Class\":{\"Semester\":\"Summer\",\"Room\":null,\"Subject\":\"Politics\",\"Notes\":\"We're happy, you happy?\"},\"Students\":{\"Smith\":{\"FirstName\":\"Mary\",\"sex\":\"Female\"},\"Brown\":{\"FirstName\":\"John\",\"sex\":\"Male\"},\"Jackson\":{\"FirstName\":\"Jackie\",\"sex\":\"Female\"}},\"Grades\":{\"Test\":[{\"grade\":\"A\",\"points\":68,\"grade\":\"B\",\"points\":25,\"grade\":\"C\",\"points\":15},{\"grade\":\"C\",\"points\":2,\"grade\":\"B\",\"points\":29,\"grade\":\"A\",\"points\":55},{\"grade\":\"C\",\"points\":2,\"grade\":\"A\",\"points\":72,\"grade\":\"A\",\"points\":65}]}}"))); 

     System.out.println("JSON: " + objectJSON); 

     StringBuilder xml = new ToXML().convertToXML(objectJSON, true); // Conversion Box!!!! 

     System.out.println("XML: " + xml); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 
} 

wyjściowa:

JSON: {"ROOT":{"Students":{"Brown":{"FirstName":"John","sex":"Male"},"Jackson":{"FirstName":"Jackie","sex":"Female"},"Smith":{"FirstName":"Mary","sex":"Female"}},"Class":{"Subject":"Politics","Room":null,"Semester":"Summer","Notes":"We're happy, you happy?"},"Grades":{"Test":[{"points":15,"grade":"C"},{"points":55,"grade":"A"},{"points":65,"grade":"A"}]},"teacher":{"age":"35","name":"Mr Borat","Nationality":"Kazakhstan"}}} 
-------- JSON Detected -------- 
-------- XML created Successfully -------- 
XML: <ROOT><Students><Brown><FirstName>John</FirstName><sex>Male</sex></Brown><Jackson><FirstName>Jackie</FirstName><sex>Female</sex></Jackson><Smith><FirstName>Mary</FirstName><sex>Female</sex></Smith></Students><Class><Subject>Politics</Subject><Room>null</Room><Semester>Summer</Semester><Notes>We're happy, you happy?</Notes></Class><Grades><Test><LIST_ELEMENT_Test><points>15</points><grade>C</grade></LIST_ELEMENT_Test><LIST_ELEMENT_Test><points>55</points><grade>A</grade></LIST_ELEMENT_Test><LIST_ELEMENT_Test><points>65</points><grade>A</grade></LIST_ELEMENT_Test></Test></Grades><teacher><age>35</age><name>Mr Borat</name><Nationality>Kazakhstan</Nationality></teacher></ROOT>