2009-02-18 3 views

ответ

14

Не Java, но чистая реализация XSLT 2.0:

Посмотрите на f:json-document() от FXSL 2.x library.

Используя эту функцию, очень легко включить JSon и использовать ее так же, как ... XML.

Например, можно просто написать следующее выражение XPath:

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

и получить все дети Students с sex = 'Female'

Вот полный пример:

<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> 

Когда выше преобразование применяется на любом документе XML (игнорируется), правильный результат получается:

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

Выглядит здорово. Но я попытался, и f: json-document() всегда возвращает пустой документ. Я разместил об этом на форуме SF.net: https://sourceforge.net/forum/message.php?msg_id=7385342 – avernet

+0

Есть пример того, как использовать эту функцию. Это файл testFunc-json-document.xsl в папке «Тесты»: http://fxsl.cvs.sourceforge.net/viewvc/fxsl/fxsl-xslt2/Tests/testFunc-json-document.xsl?revision= 1.1 & view = markup При применении к любому XML-файлу (не используется) это преобразование дает правильный результат. Одним из потенциальных факторов, которые могут вызвать вашу проблему, является использование относительно старой версии саксонской версии - пожалуйста, используйте версию Saxon 9.x. Кроме того, ссылка в вашем сообщении недоступна. –

0

Вы можете использовать json-lib, он обеспечивает двунаправленное преобразование.

3

Еще одна возможность: отстрелить, http://jettison.codehaus.org может подвергнуть JSon через интерфейс XML-синтаксического анализа (StAX XMLStreamReader), который позволяет интеграция с системами, которые понимают только XML. Это требует использования конвенции (барсук, или что-то другое, что было вызвано).

XStream, например, использует приложение Jettison (или, по крайней мере, соглашение с Барсукой), чтобы разрешить использование JSON.

Но сам вопрос немного расплывчатый: хотя вы всегда можете конвертировать из одного в другое (это очень тривиально, что нужно делать на самом деле), XML и JSON не эквивалентны: нет взаимно однозначного без потерь общее отображение. Следовательно, возникает вопрос: что вы планируете делать с результатами, как будет использоваться xml?

2

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

  • точки выше примерно не полностью Foolproof один-однозначное отображение правильны, но у меня был хороший опыт работы с преобразования XML в JSON, используя вышеупомянутую библиотеку.
25

Вы можете создать JSONObject, а затем преобразовать его в XML с помощью XML class в орг.JSON имен

Обертывание строку JSON в объект так же легко, как передать его в конструктор

JSONObject o = new JSONObject(jsonString); 

Тогда вы можете получить его в формате XML с помощью класса XML, например, так:

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

Это удивительно просто, спасибо! – Jon

+0

Можете ли вы уточнить? Я имею в виду, что я должен использовать внешние банки? Eclipse не распознает эти команды. –

+0

Вы можете попробовать следующее: http://mvnrepository.com/artifact/org.codeartisans/org.json/20130603 –

1

Вы можете попробовать https://github.com/lukas-krecan/json2xml, который обеспечивает простое преобразование JSON в XML. Для анализа событий SAX используется анализатор Jackson JSON и использует его.

0

StAXON может преобразовать JSON в XML с использованием либо XSLT с шаблонами или StAX API событий https://github.com/beckchr/staxon/wiki/Converting-JSON-to-XML

Вот простой пример:

входного файла:

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

Импорт + код:

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(); 

OUTPUT :

<?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!!!

Я использую JSON, что Dimitre наклеил в своем ответе и преобразуется в XML. Давайте посмотрим, если он работает для вас .....

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(); 
    } 
} 
} 

Выход:

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> 
Смежные вопросы