2011-12-03 14 views
5

पर कोई रूपांतरण (जावा कोड उदाहरणों के साथ, यदि संभव हो) फ्लाई पर, इनपुट JSON पर इनपुट करने के लिए कोई वास्तविक तरीका है, वास्तविक सामग्री और XML स्रोत की संरचना के बिना, फ़ाइल, स्ट्रिंग, आदि)?XML से JSON

कहें, उदाहरण के लिए, अज्ञात संरचना और एकाधिक घोंसले के स्तर के साथ एक बहुत बड़ा एक्सएमएल डेटासेट है, जो एक बड़ी टेक्स्ट फ़ाइल में संग्रहीत है। स्मृति में सबकुछ पढ़ना संभव नहीं है (अंतरिक्ष की कमी के लिए) और वे इसे JSON में सीधे रूपांतरित करना चाहते हैं, यानी, स्टैक्स टैग का पता लगाने और संभालने के लिए कोई कोड लिखने के बिना (उदा। START_ELEMENT, CHARACTERS, END_ELEMENT)।

आदर्श समाधान एक Reader या InputStream कनवर्टर से प्राप्त करने के लिए, ताकि, उदाहरण के लिए, एक एक्सएमएल फ़ाइल की आपूर्ति और Reader या InputStream पैदा करता JSON, एक करने के लिए सीधे एक FileOutputStream को खिलाया जा करने के लिए, या यहाँ तक होगा JSON पार्सर Jackson की तरह। यदि यह संभव नहीं है, कम से कम एक XML फ़ाइल को पढ़ने का एक तरीका, जेएसओएन में कनवर्ट करना और दूसरी फ़ाइल में लिखना एक स्वीकार्य समझौता होगा।

उपकरण है कि/से XML/JSON में परिवर्तित करने के लिए इस्तेमाल किया जा सकता है (जैसे, StaxON, JSON-lib, Jettison, XStream) है कि लेकिन एक ज्ञात संरचना का केवल रूपांतरण करने के लिए नहीं है।

संपादित करें:, एक Reader या InputStream एक OutputStream या एक लेखक (जो भी "रूपांतरण" कवर मैं ऊपर के बारे में कहा जाएगा), कई तरीकों से किया जा सकता है से हो रही है, हालांकि अच्छे परिणाम के लिए और "अनंत "इनपुट आकार multithreading शामिल है। इस article in Ostermiller.org में समाधानों का वर्णन किया गया है और इसी तरह के कार्यान्वयन IO-Tools library में पाया जा सकता है।

उत्तर

5

जावा के अंतर्निहित स्टैक्स कार्यान्वयन का उपयोग करके parse XML और जेटीसन से produce JSON तक यहां एक मामूली उदाहरण है।

import org.codehaus.jettison.mapped.MappedXMLOutputFactory; 

import javax.xml.stream.XMLEventReader; 
import javax.xml.stream.XMLEventWriter; 
import javax.xml.stream.XMLInputFactory; 
import java.io.StringReader; 
import java.util.HashMap; 

public class Main { 
    public static void main(String[] args) throws Exception { 
     String xml = 
      "<root><foo>foo string</foo><bar><x>1</x><y>5</y></bar></root>"; 
     XMLEventReader reader = XMLInputFactory.newInstance() 
      .createXMLEventReader(new StringReader(xml)); 
     XMLEventWriter writer = new MappedXMLOutputFactory(new HashMap()) 
      .createXMLEventWriter(System.out); 
     writer.add(reader); 
     writer.close(); 
     reader.close(); 
    } 
} 

मैं एक आत्म निहित Maven परियोजना इस on Github प्रदर्शन बना लिया है: XMLEventWriter एक लेखक के लिए एक पाठक को पूरा करने, इस सुपर सरल बनाने के लिए एक सुविधाजनक add(XMLEventWriter) विधि है।

+0

यह प्रदान करता है (या मानक आउटपुट में) समाधान "फ़ाइल लिखना"। उत्तर और अतिरिक्त प्रयास के लिए धन्यवाद! – PNS

+0

आप इस के साथ टिप्पणी टैग कैसे अनदेखा करते हैं? Xml में टिप्पणी टैग होने पर XMLEventWriter अपवाद फेंकता है। – ShaggyInjun

+0

@ShaggyInjun: यह अपना स्वयं का प्रश्न होना चाहिए, नमूना कोड के साथ पूरा होना चाहिए, 1.5 वर्षीय उत्तर पर कोई टिप्पणी नहीं। –

2

आप इसे सैक्सन के साथ कर सकते हैं, नमूना कोड के लिए https://github.com/beckchr/staxon/wiki/Converting-XML-to-JSON देखें।

+0

स्पष्ट रूप से आप एक फ़ाइल में लिख सकते हैं लेकिन JSON आउटपुट को "पाइप" को रीडर या इनपुटस्ट्रीम में "पाइप" करने का कोई सीधा तरीका नहीं है। धन्यवाद। – PNS

1

underscore-lodash लाइब्रेरी से XML और toJson से स्थिर विधियों के साथ लाइब्रेरी है।

कोड उदाहरण:

import com.github.underscore.lodash.$; 
import java.util.Map; 
import org.junit.Test; 
import static org.junit.Assert.assertEquals; 

public class StringTest { 

    @Test 
    public void toJsonFromXml() { 
     final String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<root>\n" 
      + " <FirstItem>1</FirstItem>\n <SecondItem>2</SecondItem>\n</root>"; 
     assertEquals("{\n" 
      + " \"root\": {\n" 
      + " \"FirstItem\": \"1\",\n" 
      + " \"SecondItem\": \"2\"\n" 
      + " }\n" 
      + "}", 
      $.toJson((Map<String, Object>) $.fromXml(xml))); 
    } 
} 
संबंधित मुद्दे