JSON के लिए XSLT बराबर [बंद]


411

क्या JSON के लिए XSLT बराबर है? कुछ मुझे JSON पर रूपांतरण करने की अनुमति देता है जैसे कि XSLT XML को करता है।


1
Btw, यह किस भाषा / मंच पर होगा?
स्टैक्मैन मैन

6
@StaxMan XSLT एक मानक है जिसमें कई भाषाओं और प्लेटफार्मों में वास्तविक कार्यान्वयन होता है, मेरे प्रश्न समान प्रयास को लक्षित करते हैं।
लुविएरे

36
आपके प्रश्न के लिए +1। बहुत से लोग XSLT को अनदेखा या सादे नापसंद करने लगते हैं, लेकिन यह केवल XML वर्बोसिटी की प्रतिक्रिया हो सकती है। और वास्तव में, जैसा कि एक्सएमएल धीरे-धीरे एहसान से बाहर हो जाता है, एक्सएसएलटी का उपयोग करने के लिए कम और कम अवसर हैं, जो एक दया है! JSON के लिए XSLT बराबर होगा।
निकोलस ले थिएरी डी'नेक्विन 16

10
@ निकोलस लाइटरहाइरीड'एननेक्विन सहमत। बहुत से लोग XML से नफरत करते हैं, और इसलिए XSLT को खारिज करते हैं। एक्सएमएल उपकरणों का एक्सएमएल पारिस्थितिकी तंत्र जावा देवों पर भी भारी है, जो अधिक लोगों को भी दूर कर देता है। लेकिन मैं 2000 के दशक के मध्य में XSLT में भारी था, और जबरदस्त शक्ति है जिसका XML पारिस्थितिकी तंत्र के बाहर कोई प्रत्यक्ष समकक्ष नहीं है। मैं एक JSON के बराबर प्यार करता हूँ !
जरीन

जवाबों:


77

दिलचस्प विचार। Google पर खोज करने वाले कुछ लोगों ने रुचि के कुछ पृष्ठ बनाए, जिनमें शामिल हैं:

उम्मीद है की यह मदद करेगा।


10
हाँ, धन्यवाद, यही मैं देख रहा था। यह एक अफ़सोस की बात है कि तकनीक अधिक लोकप्रिय नहीं है, JSON को अक्सर REST- शैली सेवाओं में रिटर्न फॉर्मेट के रूप में उपयोग किया जाता है और इसके परिवर्तनों को लागू करने का एक मानक तरीका होना अच्छा होगा।
ल्वीइरे

8
इस कोड का उपयोग करता string.eval () ... :-(
dreftymac

लिंक केवल जवाब
जीन फ़्राँस्वा Fabre

102

JSON के लिए XSLT समकक्ष - उम्मीदवारों की एक सूची (उपकरण और चश्मा)

उपकरण

  1. XSLT

    आप JSON के लिए XSLT का उपयोग fn: json-to-xml के उद्देश्य से कर सकते हैं

    यह खंड उन सुविधाओं का वर्णन करता है जो JSON डेटा को XSLT का उपयोग करके संसाधित करने की अनुमति देता है।

  2. JQ

    jq JSON डेटा के लिए sed की तरह है - आप इसे स्लाइस और फ़िल्टर और मैप करने के लिए उपयोग कर सकते हैं और संरचित डेटा को उसी आसानी से बदल सकते हैं जो sed, awk, grep और दोस्तों को आपको पाठ के साथ खेलने देता है। विभिन्न ओएस के लिए स्थापित पैकेज हैं।

  3. जे जे

    JJ एक कमांड लाइन उपयोगिता है जो JSON दस्तावेज़ों से मानों को पुनः प्राप्त या अपडेट करने का तेज़ और सरल तरीका प्रदान करता है। यह GJSON और SJSON द्वारा हुड के तहत संचालित है।

  4. fx

    कमांड लाइन JSON प्रोसेसिंग टूल

    • नया वाक्यविन्यास सीखने की जरूरत नहीं है
    • सादा जावास्क्रिप्ट
    • स्वरूपण और प्रकाश डालना
    • स्टैंडअलोन बाइनरी
  5. जीएल

    jl ("JSON lambda") JSON को क्वेरी और हेरफेर करने के लिए एक छोटी कार्यात्मक भाषा है।

  6. झटका

    JSON से JSON परिवर्तन लाइब्रेरी जावा में लिखी गई है जहाँ परिवर्तन के लिए "विनिर्देशन" स्वयं एक JSON दस्तावेज़ है।

  7. Gron

    JSON को संक्षिप्त करें! ग्रोन JSON को असतत असाइनमेंट में बदल देता है ताकि आप जो चाहते हैं उसे पूरा कर सकें और इसके लिए पूर्ण 'पाथ' देख सकें। यह एपीआई की खोज को आसान बनाता है जो JSON के बड़े ब्लब्स को लौटाता है लेकिन भयानक प्रलेखन है।

  8. json

    JSON JSON के साथ काम करने के लिए एक तेज CLI उपकरण है। यह एक एकल फ़ाइल नोड है। कोई बाहरी डिपो (नोड के अलावा अन्य) के साथ स्क्रिप्ट।

  9. json-ए

    JSON-e, JSON ऑब्जेक्ट्स में संदर्भ एम्बेड करने के लिए डेटा-स्ट्रक्चर पैरामीटरेशन सिस्टम है। केंद्रीय विचार एक डेटा संरचना को "टेम्पलेट" के रूप में माना जाता है और इसे आउटपुट डेटा संरचना का उत्पादन करने के लिए संदर्भ के रूप में किसी अन्य डेटा संरचना का उपयोग करके परिवर्तित करना है।

  10. JSLT

    JSLT JSON की संपूर्ण क्वेरी और परिवर्तन भाषा है। भाषा डिजाइन jq, XPath और XQuery से प्रेरित है।

  11. JSONata

    JSONata JSON डेटा के लिए एक हल्की क्वेरी और परिवर्तन भाषा है। XPath 3.1 के 'स्थान पथ' शब्दार्थ से प्रेरित होकर, यह परिष्कृत प्रश्नों को एक कॉम्पैक्ट और सहज ज्ञान युक्त अंकन में व्यक्त करने की अनुमति देता है।

  12. json-रूपांतरण अंतिम प्रतिबद्ध दिसम्बर 1, 2017

    JSON डेटा को बदलने के लिए एक पुनरावर्ती, पैटर्न-मिलान दृष्टिकोण प्रदान करता है। ट्रांसफ़ॉर्मेशन को नियमों के एक सेट के रूप में परिभाषित किया जाता है जो JSON ऑब्जेक्ट की संरचना से मेल खाते हैं। जब कोई मैच होता है, तो नियम रूपांतरित डेटा का उत्सर्जन करता है, वैकल्पिक रूप से बाल वस्तुओं को बदलने के लिए।

  13. jsawk लास्ट 4 मार्च, 2015

    Jsawk awk की तरह है, लेकिन JSON के लिए। आप स्टड से पढ़ी गई JSON ऑब्जेक्ट्स की एक सरणी के साथ काम करते हैं, उन्हें परिणाम को सरणी करने के लिए जावास्क्रिप्ट का उपयोग करके फ़िल्टर करें जो कि stdout में मुद्रित होता है।

  14. yate अंतिम 13 मार्च 2017

    टेस्ट का उपयोग https://github.com/pasaran/yate/tree/master/tests के रूप में किया जा सकता है

  15. jsonpath- ऑब्जेक्ट-ट्रांसफ़ॉर्मेशन लास्ट कमिट 18 जनवरी, 2017

    JSONPath का उपयोग करके किसी ऑब्जेक्ट शाब्दिक से डेटा खींचता है और एक टेम्पलेट पर आधारित एक नई वस्तु उत्पन्न करता है।

  16. स्टैपल लास्ट कमेट सिपाही 16, 2013

    स्टेपलिंग एक जावास्क्रिप्ट लाइब्रेरी है जो JSON ऑब्जेक्ट्स के लिए XSLT फॉर्मेटिंग को सक्षम करता है। जावास्क्रिप्ट टेम्प्लेटिंग इंजन और टेक्स्ट / html टेम्प्लेट का उपयोग करने के बजाय, स्टेपलिंग आपको अपने JSON डेटा स्रोतों को पार्स करने के लिए XSLT टेम्प्लेट का उपयोग करने का अवसर देता है - अजाक्स के साथ अतुल्यकालिक रूप से लोड किया गया और फिर क्लाइंट साइड कैश किया गया।

चश्मा:

  • JsonPointer

    JSON पॉइंटर एक जावास्क्रिप्ट ऑब्जेक्ट नोटेशन (JSON) दस्तावेज़ के भीतर एक विशिष्ट मूल्य की पहचान करने के लिए एक स्ट्रिंग सिंटैक्स को परिभाषित करता है।

  • JsonPath

    JSONPath भाव हमेशा एक JSON संरचना को उसी तरह से संदर्भित करते हैं जैसे कि XMLath अभिव्यक्ति एक्सएमएल दस्तावेज़ के साथ संयोजन में उपयोग की जाती है

  • JSPath

    JSON के लिए JSPath XML के लिए XPath जैसा है। "

  • JSONiq

    JSONiq के पीछे प्रेरणा का मुख्य स्रोत XQuery है, जो अर्ध-संरचित डेटा के लिए अब तक एक सफल और उत्पादक क्वेरी भाषा साबित हुई है


2
आपकी बहुत अलग और उपयोगी पोस्ट के लिए धन्यवाद। वन-लाइन जोंस को पठनीय रूप में बदलने के लिए, jq (nr.2 in your list) मेरे लिए सबसे अच्छा विकल्प है। एक बार फिर धन्यवाद!
प्रधानमंत्री

1
मैं अक्सर सुंदर मुद्रण के लिए json_pp का उपयोग करता हूं । यह कई विकृतियों के लिए उपलब्ध है।
jschnasse

70

JOLT का प्रयास करें । यह जावा में लिखी जाने वाली JSON परिवर्तन लाइब्रेरी का JSON है।

यह विशेष रूप से बनाया गया था क्योंकि हम "JSON -> XML -> XSLT -> XML -> JSON" गेम नहीं खेलना चाहते थे, और किसी भी पर्याप्त जटिल परिवर्तन के लिए टेम्पलेट का उपयोग करना अकल्पनीय है।


4
+9000: यह एक गंभीर परियोजना है! हुज़्ज़ाह। उदाहरणों के साथ ऑनलाइन डेमो सीखने की अवस्था पर चढ़ने में मदद करता है: jolt-demo.appspot.com
kevinarpe

15

jq - हल्का और लचीला कमांड-लाइन JSON प्रोसेसर

यह XSLT की तरह टेम्पलेट-आधारित नहीं है, लेकिन अधिक संक्षिप्त है। सरणी में फ़ील्ड nameऔर addressफ़ील्ड निकालना :[.name, .address]

ट्यूटोरियल ट्विटर के JSON एपीआई बदलने का एक उदाहरण के माध्यम से चलता है (और मैनुअल कई उदाहरण है)।


4
यह अधिक संक्षिप्त है क्योंकि यह बहुत कम सक्षम है।
इहे ओनवुका

मुझे नहीं पता था कि एक जूस के पेड़ में पुनरावर्ती रूप से दी गई विशेषता को कैसे खोजा जाए
डैनियल

@ डैनियल .. | .attr_name?तुम क्या देख रहे हो? ( stedolan.github.io/jq/manual/#RecursiveDescent से .. )
एकॉस्टिस

1
शायद XSLT के रूप में सक्षम नहीं है, लेकिन बहुत उपयोगी है और XSLT के रूप में जटिल नहीं है
बजे

15

XSLT JSON का समर्थन करता है जैसा कि http://www.w3.org/TR/xslt-30/#json पर देखा गया है

XML सीमांकक टोकनों के लिए कोणीय कोष्ठक का उपयोग करता है, JSON ब्रेसिज़, वर्ग कोष्ठक का उपयोग करता है, ... I e। XML की कम टोकन मान्यता तुलनाओं का अर्थ है कि यह घोषणात्मक परिवर्तन के लिए अनुकूलित है, जबकि अधिक तुलना, स्विच स्टेटमेंट की तरह, गति कारणों से सट्टा शाखा की भविष्यवाणी मानती है कि स्क्रिप्टिंग भाषाओं में अनिवार्य कोड के लिए उपयोगी है। प्रत्यक्ष परिणाम के रूप में, अर्ध-संरचित डेटा के विभिन्न मिश्रणों के लिए, आप उत्तरदायी पृष्ठों के हिस्से के रूप में XSLT और जावास्क्रिप्ट इंजन के प्रदर्शन को बेंचमार्क करना चाह सकते हैं। नगण्य डेटा पेलोड के लिए, रूपांतरण बिना XML क्रमांकन के JSON के साथ भी काम कर सकता है। W3 का निर्णय बेहतर विश्लेषण पर आधारित होना चाहिए।


15

मुझे हाल ही में एक टूल मिला है जो मुझे JSON स्टाइल करने के लिए पसंद है: https://github.com/twigkit/tempo । उपयोग करने के लिए बहुत आसान उपकरण - मेरी राय में, XSLT की तुलना में काम करना बहुत आसान है - XPATH प्रश्नों की कोई आवश्यकता नहीं है।


9
यदि रूपांतरण का अंतिम परिणाम HTML है तो टेंपो बहुत अच्छा लगता है। लेकिन क्या होगा यदि आप एक निहित संरचना को एक अलग तरीके से पुनर्व्यवस्थित करना चाहते हैं, फिर भी अंतिम परिणाम अभी भी JSON है। मैं अभी भी XPath का एक एनालॉग चाहता हूं ताकि मैं एक कार्यात्मक तरीके से परिवर्तन लिख सकूं।
टोड्डियस झोउ

1
टेंपो बहुत दिलचस्प है वास्तव में धन्यवाद। हालाँकि आप ब्राउज़र को xml भेज सकते हैं और xslt (<; xsl-stylheet>) और आपका ब्राउज़र xml पर लागू होगा, बिना किसी और कोड के आपके xml का निर्धारित दृश्य दिखाएगा। यह jsonT / गति के लिए भी होना चाहिए।
मार्टिन मीसर


11

कहने के लिए उपकरणों की कमी की आवश्यकता की कमी का सुझाव सिर्फ सवाल भीख माँग रहा है। लिनक्स में एक्स या वाई के लिए समर्थन करने के लिए आवेदन किया जा सकता है (ऐसे अल्पसंख्यक ओएस के लिए गुणवत्ता ड्राइवर और / या गेम को क्यों परेशान करें? और क्यों एक ओएस पर ध्यान दें कि बड़े गेम और हार्डवेयर कंपनियां विकसित नहीं होती हैं?)। संभवतः जिन लोगों को XSLT और JSON का उपयोग करने की आवश्यकता होगी, वे कुछ हद तक मामूली वर्कअराउंड का उपयोग कर रहे हैं: JSON को XML में बदलना। लेकिन यह इष्टतम समाधान नहीं है, क्या यह है?

जब आपके पास एक देशी JSON प्रारूप होता है और आप इसे ब्राउज़र में "wysywyg" संपादित करना चाहते हैं, तो XSLT समस्या के लिए पर्याप्त समाधान से अधिक होगा। पारंपरिक जावास्क्रिप्ट प्रोग्रामिंग के साथ ऐसा करने से गधे में दर्द हो सकता है।

वास्तव में, मैंने XSLT के लिए एक "पत्थर-आयु" दृष्टिकोण को लागू किया है, जावास्क्रिप्ट का उपयोग करने के लिए कुछ बुनियादी आदेशों की व्याख्या करने के लिए पार्सिंग का उपयोग करके, जैसे कि एक टेम्पलेट को कॉल करना, बच्चों को प्रक्रिया करना, आदि। निश्चित रूप से JSON ऑब्जेक्ट के साथ एक परिवर्तन इंजन को लागू करना बहुत आसान है। XSLT पार्स करने के लिए एक पूर्ण XML XML पार्सर लागू करना। समस्या यह है, कि JSON ऑब्जेक्ट को बदलने के लिए XML टेम्प्लेट का उपयोग करने के लिए आपको टेम्प्लेट के XML को पार्स करने की आवश्यकता होती है।

XML (या HTML, या पाठ या जो कुछ भी) के साथ एक JSON ऑब्जेक्ट को ट्रांसफॉर्म करने के लिए आपको सिंटैक्स के बारे में सावधानी से सोचने की जरूरत है और परिवर्तन कमांड की पहचान करने के लिए आपको कौन से विशेष वर्णों का उपयोग करने की आवश्यकता है। अन्यथा आप अपनी स्वयं की कस्टम टेंपलेटिंग भाषा के लिए एक पार्सर डिजाइन करने का प्रयास करेंगे। उस रास्ते से चलने के बाद, मैं आपको बता सकता हूं कि यह सुंदर नहीं है।

अद्यतन (12 नवंबर, 2010): मेरे पार्सर पर काम करने के कुछ हफ़्ते बाद, मैं इसे अनुकूलित करने में सक्षम रहा हूं। टेम्पलेट पहले से पार्स किए जाते हैं और कमांड को JSON ऑब्जेक्ट्स के रूप में संग्रहीत किया जाता है। परिवर्तन नियम भी JSON ऑब्जेक्ट हैं, जबकि टेम्प्लेट कोड HTML का मिश्रण है और शेल कोड के समान होमब्रेव सिंटैक्स है। डॉक्यूमेंट एडिटर बनाने के लिए मैं एक जटिल JSON डॉक्यूमेंट को HTML में बदलने में सक्षम रहा हूं। कोड संपादक के लिए 1K लाइनों के आसपास है (यह एक निजी परियोजना के लिए है, इसलिए मैं इसे साझा नहीं कर सकता) और JSON परिवर्तन कोड के लिए लगभग 990 लाइनें (पुनरावृति आदेश, सरल तुलना, टेम्पलेट कॉलिंग, चर बचत और मूल्यांकन शामिल है)। मेरी योजना इसे एमआईटी लाइसेंस के तहत जारी करने की है। यदि आप शामिल होना चाहते हैं तो मुझे एक मेल ड्रॉप करें।


11

मैंने हाल ही में इसके इर्द-गिर्द अपनी एक छोटी सी लाइब्रेरी लिखी है, जो करीब रहने की कोशिश करती है

5.1 प्रोसेसिंग मॉडल (XSLT REC) https://www.w3.org/TR/xslt#section-Processing-Model

जावास्क्रिप्ट कोड की कुछ पंक्तियों में (जैसा कि वैसे भी मैं कर सकता था) संभव है।

यहाँ कुछ नहीं पूरी तरह से उपयोग के तुच्छ उदाहरण हैं ...

1. JSON-to-some-markup:

फिडल: https://jsfiddle.net/YSharpLanguage/kj9pk8oz/10

( D.1 दस्तावेज़ उदाहरण (XSLT REC) से प्रेरित होकर https://www.w3.org/TR/xslt#section-Docuy-Example )

यह कहां:

var D1document = {
    type: "document", title: [ "Document Title" ],
    "": [
      { type: "chapter", title: [ "Chapter Title" ],
        "": [
        { type: "section", title: [ "Section Title" ],
          "": [
            { type: "para", "": [ "This is a test." ] },
            { type: "note", "": [ "This is a note." ] }
        ] },
        { type: "section", title: [ "Another Section Title" ],
          "": [
            { type: "para", "": [ "This is ", { emph: "another" }, " test." ] },
            { type: "note", "": [ "This is another note." ] }
        ] }
      ] }
    ] };

var D1toHTML = { $: [
  [ [ function(node) { return node.type === "document"; } ],
    function(root) {
      return "<html>\r\n\
  <head>\r\n\
    <title>\r\n\
      {title}\r\n".of(root) + "\
    </title>\r\n\
  </head>\r\n\
  <body>\r\n\
{*}".of(root[""].through(this)) + "\
  </body>\r\n\
</html>";
    }
  ],
  [ [ function(node) { return node.type === "chapter"; } ],
    function(chapter) {
      return "    <h2>{title}</h2>\r\n".of(chapter) + "{*}".of(chapter[""].through(this));
    }
  ],
  [ [ function(node) { return node.type === "section"; } ],
    function(section) {
      return "    <h3>{title}</h3>\r\n".of(section) + "{*}".of(section[""].through(this));
    }
  ],
  [ [ function(node) { return node.type === "para"; } ],
    function(para) {
      return "    <p>{*}</p>\r\n".of(para[""].through(this));
    }
  ],
  [ [ function(node) { return node.type === "note"; } ],
    function(note) {
      return '    <p class="note"><b>NOTE: </b>{*}</p>\r\n'.of(note[""].through(this));
    }
  ],
  [ [ function(node) { return node.emph; } ],
    function(emph) {
      return "<em>{emph}</em>".of(emph);
    }
  ]
] };

console.log(D1document.through(D1toHTML));

... देता है:

<html>
  <head>
    <title>
      Document Title
    </title>
  </head>
  <body>
    <h2>Chapter Title</h2>
    <h3>Section Title</h3>
    <p>This is a test.</p>
    <p class="note"><b>NOTE: </b>This is a note.</p>
    <h3>Another Section Title</h3>
    <p>This is <em>another</em> test.</p>
    <p class="note"><b>NOTE: </b>This is another note.</p>
  </body>
</html>

तथा

2. JSON-J-JSON:

फिडल: https://jsfiddle.net/YSharpLanguage/ppfmmu15/10

यह कहां:

// (A "Company" is just an object with a "Team")
function Company(obj) {
  return obj.team && Team(obj.team);
}

// (A "Team" is just a non-empty array that contains at least one "Member")
function Team(obj) {
  return ({ }.toString.call(obj) === "[object Array]") &&
         obj.length &&
         obj.find(function(item) { return Member(item); });
}

// (A "Member" must have first and last names, and a gender)
function Member(obj) {
  return obj.first && obj.last && obj.sex;
}

function Dude(obj) {
  return Member(obj) && (obj.sex === "Male");
}

function Girl(obj) {
  return Member(obj) && (obj.sex === "Female");
}

var data = { team: [
  { first: "John", last: "Smith", sex: "Male" },
  { first: "Vaio", last: "Sony" },
  { first: "Anna", last: "Smith", sex: "Female" },
  { first: "Peter", last: "Olsen", sex: "Male" }
] };

var TO_SOMETHING_ELSE = { $: [

  [ [ Company ],
    function(company) {
      return { some_virtual_dom: {
        the_dudes: { ul: company.team.select(Dude).through(this) },
        the_grrls: { ul: company.team.select(Girl).through(this) }
      } }
    } ],

  [ [ Member ],
    function(member) {
      return { li: "{first} {last} ({sex})".of(member) };
    } ]

] };

console.log(JSON.stringify(data.through(TO_SOMETHING_ELSE), null, 4));

... देता है:

{
    "some_virtual_dom": {
        "the_dudes": {
            "ul": [
                {
                    "li": "John Smith (Male)"
                },
                {
                    "li": "Peter Olsen (Male)"
                }
            ]
        },
        "the_grrls": {
            "ul": [
                {
                    "li": "Anna Smith (Female)"
                }
            ]
        }
    }
}

3. एक्सएसएलटी बनाम जावास्क्रिप्ट:

एक जावास्क्रिप्ट के बराबर ...

XSLT 3.0 REC धारा 14.4 उदाहरण: सामान्य मानों के आधार पर समूहीकरण नोड्स

(at: http://jsfiddle.net/YSharpLanguage/8bqcd0ey/1 )

सी एफ https://www.w3.org/TR/xslt-30/#grouping-examples

कहाँ पे...

var cities = [
  { name: "Milano",  country: "Italia",      pop: 5 },
  { name: "Paris",   country: "France",      pop: 7 },
  { name: "München", country: "Deutschland", pop: 4 },
  { name: "Lyon",    country: "France",      pop: 2 },
  { name: "Venezia", country: "Italia",      pop: 1 }
];

/*
  Cf.
  XSLT 3.0 REC Section 14.4
  Example: Grouping Nodes based on Common Values

  https://www.w3.org/TR/xslt-30/#grouping-examples
*/
var output = "<table>\r\n\
  <tr>\r\n\
    <th>Position</th>\r\n\
    <th>Country</th>\r\n\
    <th>City List</th>\r\n\
    <th>Population</th>\r\n\
  </tr>{*}\r\n\
</table>".of
  (
    cities.select().groupBy("country")(function(byCountry, index) {
      var country = byCountry[0],
          cities = byCountry[1].select().orderBy("name");
      return "\r\n\
  <tr>\r\n\
    <td>{position}</td>\r\n\
    <td>{country}</td>\r\n\
    <td>{cities}</td>\r\n\
    <td>{population}</td>\r\n\
  </tr>".
        of({ position: index + 1, country: country,
             cities: cities.map(function(city) { return city.name; }).join(", "),
             population: cities.reduce(function(sum, city) { return sum += city.pop; }, 0)
           });
    })
  );

... देता है:

<table>
  <tr>
    <th>Position</th>
    <th>Country</th>
    <th>City List</th>
    <th>Population</th>
  </tr>
  <tr>
    <td>1</td>
    <td>Italia</td>
    <td>Milano, Venezia</td>
    <td>6</td>
  </tr>
  <tr>
    <td>2</td>
    <td>France</td>
    <td>Lyon, Paris</td>
    <td>9</td>
  </tr>
  <tr>
    <td>3</td>
    <td>Deutschland</td>
    <td>München</td>
    <td>4</td>
  </tr>
</table>

4. जोंसिएक बनाम जावास्क्रिप्ट:

एक जावास्क्रिप्ट के बराबर ...

JSONiq का उपयोग करें मामले 1.1.2 धारा। JSON के लिए समूहीकरण समूह

(at: https://jsfiddle.net/YSharpLanguage/hvo24hmk/3 )

सी एफ http://jsoniq.org/docs/JSONiq-usecases/html-single/index.html#jsongrouping

कहाँ पे...

/*
  1.1.2. Grouping Queries for JSON
  http://jsoniq.org/docs/JSONiq-usecases/html-single/index.html#jsongrouping
*/
var sales = [
  { "product" : "broiler", "store number" : 1, "quantity" : 20  },
  { "product" : "toaster", "store number" : 2, "quantity" : 100 },
  { "product" : "toaster", "store number" : 2, "quantity" : 50 },
  { "product" : "toaster", "store number" : 3, "quantity" : 50 },
  { "product" : "blender", "store number" : 3, "quantity" : 100 },
  { "product" : "blender", "store number" : 3, "quantity" : 150 },
  { "product" : "socks", "store number" : 1, "quantity" : 500 },
  { "product" : "socks", "store number" : 2, "quantity" : 10 },
  { "product" : "shirt", "store number" : 3, "quantity" : 10 }
];

var products = [
  { "name" : "broiler", "category" : "kitchen", "price" : 100, "cost" : 70 },
  { "name" : "toaster", "category" : "kitchen", "price" : 30, "cost" : 10 },
  { "name" : "blender", "category" : "kitchen", "price" : 50, "cost" : 25 },
  {  "name" : "socks", "category" : "clothes", "price" : 5, "cost" : 2 },
  { "name" : "shirt", "category" : "clothes", "price" : 10, "cost" : 3 }
];

var stores = [
  { "store number" : 1, "state" : "CA" },
  { "store number" : 2, "state" : "CA" },
  { "store number" : 3, "state" : "MA" },
  { "store number" : 4, "state" : "MA" }
];

var nestedGroupingAndAggregate = stores.select().orderBy("state").groupBy("state")
( function(byState) {
    var state = byState[0],
        stateStores = byState[1];
    byState = { };
    return (
      (
        byState[state] =
        products.select().orderBy("category").groupBy("category")
        ( function(byCategory) {
            var category = byCategory[0],
                categoryProducts = byCategory[1],
                categorySales = sales.filter(function(sale) {
                  return stateStores.find(function(store) { return sale["store number"] === store["store number"]; }) &&
                         categoryProducts.find(function(product) { return sale.product === product.name; });
                });
            byCategory = { };
            return (
              (
                byCategory[category] =
                categorySales.select().orderBy("product").groupBy("product")
                ( function(byProduct) {
                    var soldProduct = byProduct[0],
                        soldQuantities = byProduct[1];
                    byProduct = { };
                    return (
                      (
                        byProduct[soldProduct] =
                        soldQuantities.reduce(function(sum, sale) { return sum += sale.quantity; }, 0)
                      ),
                      byProduct
                    );
                } ) // byProduct()
              ),
              byCategory
            );
        } ) // byCategory()
      ),
      byState
    );
} ); // byState()

... देता है:

[
  {
    "CA": [
      {
        "clothes": [
          {
            "socks": 510
          }
        ]
      },
      {
        "kitchen": [
          {
            "broiler": 20
          },
          {
            "toaster": 150
          }
        ]
      }
    ]
  },
  {
    "MA": [
      {
        "clothes": [
          {
            "shirt": 10
          }
        ]
      },
      {
        "kitchen": [
          {
            "blender": 250
          },
          {
            "toaster": 50
          }
        ]
      }
    ]
  }
]

यह JSONPath wrt की सीमाओं को दूर करने के लिए भी उपयोगी है। पूर्वज अक्ष के विरुद्ध क्वेरी करना, जैसा कि इस SO प्रश्न (और निश्चित रूप से अन्य) द्वारा उठाया गया है ।

उदाहरण के लिए, किसी किराने की वस्तु की छूट कैसे प्राप्त करें, इसकी ब्रांड आईडी, में जाने

{
 "prods": [
    {
        "info": {
              "rate": 85
                },
        "grocery": [
                 {
                  "brand": "C",
                  "brand_id": "984"
                 },
                 {
                  "brand": "D",
                  "brand_id": "254"
                 }
                 ],
         "discount": "15"
    },
    {
        "info": {
              "rate": 100
                },
        "grocery": [
                 {
                  "brand": "A",
                  "brand_id": "983"
                 },
                 {
                  "brand": "B",
                  "brand_id": "253"
                 }
                 ],
         "discount": "20"
     }
 ]
}

?

एक संभावित समाधान है:

var products = {
     "prods": [
        {
            "info": {
                  "rate": 85
                    },
            "grocery": [
                     {
                      "brand": "C",
                      "brand_id": "984"
                     },
                     {
                      "brand": "D",
                      "brand_id": "254"
                     }
                     ],
             "discount": "15"
        },
        {
            "info": {
                  "rate": 100
                    },
            "grocery": [
                     {
                      "brand": "A",
                      "brand_id": "983"
                     },
                     {
                      "brand": "B",
                      "brand_id": "253"
                     }
                     ],
             "discount": "20"
         }
     ]
};

function GroceryItem(obj) {
  return (typeof obj.brand === "string") && (typeof obj.brand_id === "string");
}

    // last parameter set to "true", to grab all the "GroceryItem" instances
    // at any depth:
var itemsAndDiscounts = [ products ].nodeset(GroceryItem, true).
    map(
      function(node) {
        var item = node.value, // node.value: the current "GroceryItem" (aka "$.prods[*].grocery[*]")

            discount = node.parent. // node.parent: the array of "GroceryItem" (aka "$.prods[*].grocery")
                       parent. // node.parent.parent: the product (aka "$.prods[*]")
                       discount; // node.parent.parent.discount: the product discount

        // finally, project into an easy-to-filter form:
        return { id: item.brand_id, discount: discount };
      }
    ),
    discountOfItem983;

discountOfItem983 = itemsAndDiscounts.
  filter
  (
    function(mapped) {
      return mapped.id === "983";
    }
  )
  [0].discount;

console.log("Discount of #983: " + discountOfItem983);

... जो देता है:

Discount of #983: 20

'HTH,


10

वहां है अभी! मैंने हाल ही में इस उद्देश्य के लिए एक पुस्तकालय, जोंस-ट्रांसफ़ॉर्म बनाए हैं :

https://github.com/ColinEberhardt/json-transforms

यह JSPath के संयोजन का उपयोग करता है , XPath पर एक डीएसएल मॉडल, और एक पुनरावर्ती पैटर्न मिलान दृष्टिकोण, जो सीधे XSLT द्वारा प्रेरित है।

यहाँ एक त्वरित उदाहरण है। निम्नलिखित JSON ऑब्जेक्ट को देखते हुए:

const json = {
  "automobiles": [
    { "maker": "Nissan", "model": "Teana", "year": 2011 },
    { "maker": "Honda", "model": "Jazz", "year": 2010 },
    { "maker": "Honda", "model": "Civic", "year": 2007 },
    { "maker": "Toyota", "model": "Yaris", "year": 2008 },
    { "maker": "Honda", "model": "Accord", "year": 2011 }
  ]
};

यहाँ एक परिवर्तन है:

const jsont = require('json-transforms');
const rules = [
  jsont.pathRule(
    '.automobiles{.maker === "Honda"}', d => ({
      Honda: d.runner()
    })
  ),
  jsont.pathRule(
    '.{.maker}', d => ({
      model: d.match.model,
      year: d.match.year
    })
  ),
  jsont.identity
];

const transformed  = jsont.transform(json, rules);

निम्नलिखित में से कौन सा आउटपुट है:

{
  "Honda": [
    { "model": "Jazz", "year": 2010 },
    { "model": "Civic", "year": 2007 },
    { "model": "Accord", "year": 2011 }
  ]
}

यह परिवर्तन तीन नियमों से बना है। किसी भी ऑटोमोबाइल से पहली बार मेल खाता है, जो होंडा द्वारा बनाई गई है, एक Hondaसंपत्ति के साथ एक वस्तु का उत्सर्जन , फिर पुनरावर्ती मिलान। दूसरा नियम किसी makerसंपत्ति के साथ किसी भी वस्तु से मेल खाता है, modelऔर yearगुणों का उत्पादन करता है। अंतिम पहचान परिवर्तन है जो पुनरावर्ती मेल खाता है।


9

एक पुराने प्रश्न का एक और नया उत्तर के रूप में, मैं DefiantJS को देखने का सुझाव दूंगा । यह एक XSLT नहीं है बराबर JSON के लिए, यह है JSON के लिए XSLT। प्रलेखन के "अस्थायी" अनुभाग में यह उदाहरण शामिल है:

<!-- Defiant template -->
<script type="defiant/xsl-template">
    <xsl:template name="books_template">
        <xsl:for-each select="//movie">
            <xsl:value-of select="title"/><br/>
        </xsl:for-each>
    </xsl:template>
</script>

<script type="text/javascript">

var data = {
        "movie": [
            {"title": "The Usual Suspects"},
            {"title": "Pulp Fiction"},
            {"title": "Independence Day"}
        ]
    },
    htm = Defiant.render('books_template', data);

console.log(htm);
// The Usual Suspects<br>
// Pulp Fiction<br>
// Independence Day<br>

5

मैं वास्तव में जावास्क्रिप्ट टेंपलेटिंग इंजनों की भारी मात्रा में थक गया हूं, और उनके सभी इनलाइन एचटीएमएल-टेम्प्लेट, अलग-अलग मार्कअप स्टाइल इत्यादि, और एक छोटी सी लाइब्रेरी बनाने का फैसला किया है जो जेएसएन डेटा संरचनाओं के लिए XSLT प्रारूपण को सक्षम बनाता है। किसी भी तरह से रॉकेट साइंस नहीं - यह सिर्फ JSON XML में पार्स किया गया और फिर XSLT दस्तावेज़ के साथ स्वरूपित किया गया। यह क्रोम में जावास्क्रिप्ट टेम्प्लेट इंजन के रूप में भी तेज़ नहीं है, लेकिन अधिकांश अन्य ब्राउज़रों में यह कम से कम उतना ही तेज़ है जितना कि अन्य डेटा संरचनाओं के लिए जेएस इंजन विकल्प।


4

मैं ऊंट मार्ग उमरशल (xmljson) -> से (xlst) -> मार्शल (xmljson) का उपयोग कर रहा हूं। पर्याप्त पर्याप्त (हालांकि 100% सही नहीं), लेकिन सरल, यदि आप पहले से ही कैमल का उपयोग कर रहे हैं।


3

JSONiq एक ऐसा मानक है और Zorba एक ओपन-सोर्स C ++ कार्यान्वयन है। JSONi को JSON को मूल डेटा प्रकार के रूप में जोड़ने के साथ XQuery के रूप में भी देखा जा सकता है।



2

Yate ( https://github.com/pasaran/yate ) को विशेष रूप से XSLT के बाद डिज़ाइन किया गया है, JPath (JS के लिए एक प्राकृतिक XPath समतुल्य) की विशेषता है, जावास्क्रिप्ट का संकलन करता है और उत्पादन के उपयोग का काफी इतिहास रखता है। यह व्यावहारिक रूप से अनिर्दिष्ट है, लेकिन नमूनों और परीक्षणों के माध्यम से पढ़ना पर्याप्त होना चाहिए।


2

JSLT , XSLT के बराबर JSON के बहुत करीब है। यह एक रूपांतरित भाषा है जहाँ आप JSON सिंटैक्स में आउटपुट के निश्चित भाग को लिखते हैं, फिर टेम्पलेट में सम्मिलित किए जाने वाले मानों की गणना करने के लिए अभिव्यक्तियाँ सम्मिलित करते हैं।

एक उदाहरण:

{
  "time": round(parse-time(.published, "yyyy-MM-dd'T'HH:mm:ssX") * 1000),
  "device_manufacturer": .device.manufacturer,
  "device_model": .device.model,
  "language": .device.acceptLanguage
}

यह जैक्सन के शीर्ष पर जावा में लागू किया गया है।


0

यह भी सुनिश्चित नहीं है कि इसके लिए आवश्यकता है, और मेरे लिए उपकरणों की कमी की आवश्यकता का अभाव है। JSON को ऑब्जेक्ट्स के रूप में सबसे अच्छा संसाधित किया जाता है (वैसे भी जेएस में यह किया जाता है), और आप आम तौर पर ट्रांसफ़ॉर्मेशन करने के लिए ऑब्जेक्ट्स की भाषा का उपयोग करते हैं (JSON से बनाए गए जावा ऑब्जेक्ट्स के लिए, Perl, Python, Perl, c #, PHP के लिए समान है) और पर)। बस सामान्य असाइनमेंट (या सेट करें, प्राप्त करें), लूपिंग और इसी तरह।

मेरा मतलब है, XSLT सिर्फ एक और भाषा है, और इसकी एक वजह यह है कि XML एक ऑब्जेक्ट नोटेशन नहीं है और इस प्रकार प्रोग्रामिंग भाषाओं की वस्तुएं सटीक रूप से फिट नहीं होती हैं (पदानुक्रम xml मॉडल और ऑब्जेक्ट्स / स्ट्रक्चर के बीच प्रतिबाधा)।


फेसबुक के XML से Json में परिवर्तित होने के बाद, मुझे इस तरह के टूल की सख्त आवश्यकता है।
जो सोल-लाने वाला

क्या केस केस सोच रहे हो? क्या यह JSON सामग्री को समान करने में सक्षम है कि आप XML प्रतिक्रियाओं को HTML के रूप में कैसे प्रस्तुत करेंगे? या कुछ अलग है?
स्टैक्मैन मैन

मुझे आश्चर्य है कि JSON परिवर्तन को प्रोग्रामेटिक ऑब्जेक्ट तरीका (w / looping, ब्रांचिंग आवश्यकतानुसार, आदि) में हेरफेर करना आसान होगा। बनाम XSLT प्रकार की विधि का उपयोग करके, विशेष रूप से बड़े पैमाने पर JSON ऑब्जेक्ट को बदलने के मामले में और जहां स्रोत JSON में कुछ डेटा स्थानांतरित किया गया है। JSON में कुछ नोड्स ऊपर / नीचे (इसलिए केवल संरचना की एक सीधी प्रतिलिपि नहीं है) और कहें कि स्रोत या लक्ष्य में एक विशेष नोड JSON JSON के भीतर ऑब्जेक्ट सरणी का हिस्सा है और अन्य JSON (स्रोत / लक्ष्य) नहीं है ।
डेविड

सहजता बहुत व्यक्तिपरक है, इसलिए मुझे बहुत संदेह है कि इसका क्या करना है।
स्टेक्समैन

जबकि निश्चित रूप से JSON परिवर्तन की आवश्यकता है, आप सही कह रहे हैं कि यह काफी हद तक JS द्वारा पूरा किया गया है। :-) लेकिन क्या आपने jq - हल्की और लचीली कमांड लाइन JSON प्रोसेसर देखी है ? खासकर जब JS उपलब्ध नहीं है। मैं कहूंगा कि जेएस की तुलना में परिवर्तन नाटकीय रूप से आसान और अधिक सहज है। खेतों को निकालने nameऔर address, और उन्हें एक सरणी में रखने के लिए जैसे :[.name, .address]
13ren

0

आप मिस्टर डेटा कवरर का उपयोग करके JSON को XML में कनवर्ट क्यों नहीं करते हैं , XSLT का उपयोग करके इसे ट्रांसफॉर्म करें और फिर उसी का उपयोग करके इसे वापस JSON में बदल दें।


1
यह एक विकल्प नहीं है यदि आप चाहते हैं कि आपका कोड आपके लिए अच्छा प्रदर्शन करे।
orad

0

XSLT की मिलान अभिव्यक्तियों और पुनरावर्ती टेम्पलेट्स के पीछे परिचित और घोषणात्मक पैटर्न के साथ-साथ शुद्ध जावास्क्रिप्ट का उपयोग करने के लिए एक दृष्टिकोण की अवधारणा के काम करने के सिद्धांत के लिए, https://gist.github.com/brettz9/0e661bb93764f496e36 देखें

(JSON के लिए एक समान दृष्टिकोण लिया जा सकता है।)

ध्यान दें कि डेमो भी फ़ायरफ़ॉक्स में टेम्पलेट की सुविधा के लिए जावास्क्रिप्ट 1.8 अभिव्यक्ति पर निर्भर करता है (कम से कम तब तक जब तक ईएस 6 शॉर्ट फॉर्म लागू नहीं किया जा सकता है)।

अस्वीकरण: यह मेरा अपना कोड है।


0

मैंने बहुत समय पहले अपने जैकसन आधारित जसन प्रसंस्करण ढांचे के लिए एक डोम एडेप्टर लिखा था। यह nu.xom लाइब्रेरी का उपयोग करता है। परिणामी डोम ट्री जावा xpath और xslt सुविधाओं के साथ काम करता है। मैंने कुछ कार्यान्वयन विकल्प बनाए जो बहुत सीधे हैं। उदाहरण के लिए रूट नोड को हमेशा "रूट" कहा जाता है, सरणियाँ एक उप नोड में ली उप तत्वों (जैसे html) के साथ जाती हैं, और बाकी सब सिर्फ एक उप नोड है जो एक आदिम मान या किसी अन्य ऑब्जेक्ट नोड के साथ है।

JsonXmlConverter.java

उपयोग: JsonObject sampleJson = sampleJson(); org.w3c.dom.Document domNode = JsonXmlConverter.getW3cDocument(sampleJson, "root");


0

अभी तक नहीं दिया गया एक दृष्टिकोण XSLT में एक पार्सर बनाने के लिए एक पार्सर जनरेटर का उपयोग करना है जो JSON को पार्स करता है और एक XML आउटपुट पैदा करता है।

एक विकल्प जो एक्सएमएल सम्मेलनों में बहुत अधिक उल्लेख किया जाता है वह है रेक्स पार्सर जनरेटर ( http://www.bottlecaps.de/rex/ ) - हालांकि साइट पर पूरी तरह से अनिर्दिष्ट है , खोज पर व्यंजन उपलब्ध हैं।


0

JSON के साथ XSLT का उपयोग करना संभव हो सकता है। XPath (3.1) XSLT (3.0) और XQuery (3.1) के वेरसन 3 किसी तरह से JSON का समर्थन करते हैं। यह सैक्सन के व्यावसायिक संस्करण में उपलब्ध लगता है, और कुछ बिंदु पर HE संस्करण में शामिल किया जा सकता है। https://www.saxonica.com/html/documentation/functions/fn/parse-json.html

-

मैं वैकल्पिक समाधान से क्या उम्मीद करूंगा:

मैं डेटा का एक मिलान सेट लाने के लिए JSON इनपुट करने में सक्षम होना चाहता हूं, और JSON या TEXT आउटपुट करता हूं।

मनमाने गुणों तक पहुँचें और मूल्यों का मूल्यांकन करें

सशर्त तर्क के लिए समर्थन

मैं रूपांतरण लिपियों को उपकरण से बाहरी होना चाहता हूं, पाठ आधारित, और अधिमानतः इस्तेमाल की जाने वाली भाषा।

संभावित विकल्प?

मुझे आश्चर्य है कि अगर एसक्यूएल एक उपयुक्त विकल्प हो सकता है। https://docs.microsoft.com/en-us/sql/relational-databases/json/json-data-sql-server

अच्छा होगा यदि वैकल्पिक उपकरण JSON और XML https://docs.microsoft.com/en-us/sql/relational-dat डेटाबेस / xml / openxml-sql-server को संभाल सके

मैंने अभी तक XSLT लिपियों को SQL में उपयोग करने की कोशिश नहीं की है, या इस विकल्प का पूरी तरह से मूल्यांकन अभी तक किया है, लेकिन मुझे उम्मीद है कि इस पर जल्द ही गौर किया जाएगा। अभी तक सिर्फ कुछ विचार।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.