क्या JSON "[" से शुरू हो सकता है?


178

मैं json.org पर क्या पढ़ सकता हूं , सभी JSON स्ट्रिंग्स को {(घुंघराले ब्रेस) के साथ शुरू करना चाहिए , और [वर्ण (वर्ग कोष्ठक) JSON में एक सरणी तत्व का प्रतिनिधित्व करते हैं।

मैं json4jपुस्तकालय का उपयोग करता हूं , और मुझे एक इनपुट मिला है जो इसके साथ शुरू होता है [, इसलिए मुझे नहीं लगा कि यह वैध JSON था। मैंने संक्षेप में JSON स्कीमा को देखा, लेकिन मैं वास्तव में यह नहीं कह पाया कि JSON फाइल शुरू नहीं हो सकती है [, या यह केवल इसके साथ शुरू हो सकती है {


(जाहिरा तौर पर कई बीमार-डिज़ाइन किए गए JSON लाइब्रेरी हैं जो आपको सबसे बाहरी JSON प्रकार जानने की आवश्यकता है। यहाँ पर सबसे सरल "फिक्स" है JSON स्ट्रिंग को घेरने के लिए [], इसे एक सरणी के रूप में पार्स करें, और पहला सरणी तत्व लें।)
हॉट लिक्स

जाहिरा तौर पर यह सुरक्षित है कि इसकी शुरुआत {और न हो [इसलिए कि यह एक मान्य जावास्क्रिप्ट सरणी नहीं है, और इसका उपयोग CSRF हमलों के लिए नहीं किया जा सकता है।
डेविड क्लेम्फनर

जवाबों:


218

JSON एक एरे या ऑब्जेक्ट हो सकता है। विशेष रूप से json.org से दूर:

JSON दो संरचनाओं पर बनाया गया है:

  • नाम / मूल्य जोड़े का एक संग्रह। विभिन्न भाषाओं में, यह एक वस्तु, रिकॉर्ड, संरचना, शब्दकोश, हैश टेबल, की-लिस्ट, या साहचर्य सरणी के रूप में महसूस किया जाता है।
  • मूल्यों की एक क्रमबद्ध सूची। अधिकांश भाषाओं में, यह एक
    सरणी, वेक्टर, सूची या अनुक्रम के रूप में महसूस किया जाता है ।

इसके बाद यह दो संरचनाओं का वर्णन करता है: एक JSON ऑब्जेक्ट एक JSON सरणी

ध्यान दें कि प्रारंभिक और अंत वर्ण क्रमशः घुंघराले कोष्ठक और वर्ग कोष्ठक हैं।


यहाँ से संपादित करें: http://www.ietf.org/rfc/rfc4627.txt

JSON टेक्स्ट टोकन का एक क्रम है। टोकन के सेट में छह संरचनात्मक वर्ण, तार, संख्या और तीन शाब्दिक नाम शामिल हैं।

JSON टेक्स्ट एक क्रमबद्ध ऑब्जेक्ट या सरणी है।

अपडेट (2014)

मार्च 2014 तक, एक नया JSON RFC ( 7159 ) है जो परिभाषा को थोड़ा संशोधित करता है (पृष्ठ 4/5 देखें)।

RFC 4627 प्रति परिभाषा थी: JSON-text = object / array

इसे RFC 7159 में बदल दिया गया है: JSON-text = ws value ws

कहाँ wsखाली स्थान के प्रतिनिधित्व करता है और valueइस प्रकार परिभाषित किया गया है:

एक JSON मूल्य एक वस्तु, सरणी, संख्या, या स्ट्रिंग, या निम्नलिखित तीन शाब्दिक नामों में से एक होना चाहिए:

false null true

तो, सवाल का जवाब अभी भी है हाँ, JSON पाठ एक वर्ग ब्रैकेट (यानी एक सरणी) के साथ शुरू हो सकता है। लेकिन वस्तुओं और सरणियों के अलावा, यह अब एक संख्या, स्ट्रिंग या मान भी हो सकता है false, nullया true

इसके अलावा, यह मेरे पिछले RFC 4627 उद्धरण (जोर जोड़ा) से बदल गया है:

JSON टेक्स्ट टोकन का एक क्रम है। टोकन के सेट में छह संरचनात्मक वर्ण, तार, संख्या और तीन शाब्दिक नाम शामिल हैं।

JSON टेक्स्ट एक क्रमबद्ध मूल्य है । ध्यान दें कि JSON के कुछ पिछले विनिर्देशों ने JSON टेक्स्ट को ऑब्जेक्ट या एरे होने के लिए विवश किया था। कार्यान्वयन जो केवल वस्तुओं या सरणियों को उत्पन्न करते हैं जहां एक JSON पाठ कहा जाता है इस अर्थ में अंतर होगा कि सभी कार्यान्वयन इन्हें JSON ग्रंथों के अनुरूप स्वीकार करेंगे।


धन्यवाद, मैं उस आंकड़े को कई बार देखता हूं, जाहिर है कि json4j लाइब्रेरी के साथ एक समस्या है, जो [के साथ एक json पसंद नहीं करता है।
तिबेरू

1
@Tiberiu हज: मुझे इसे समझने में थोड़ा समय लगा जब मैंने पहली बार इसे पाया। लेकिन JSON के कुछ उदाहरणों को देखने और उनकी तुलना करने के बाद, मुझे वास्तव में पसंद आया कि उन्होंने यह कैसे किया। Json4j के बारे में, शायद आप json4j लाइब्रेरी के निर्माता को बग रिपोर्ट सबमिट कर सकते हैं ।
रिचर्ड मार्स्केल - Drackir

मुझे शायद पार्टी के लिए देर हो रही है। लेकिन मुझे RFC 8259 में जो कुछ मिला वह कहता है कि A JSON टेक्स्ट यूनिकोड कोड पॉइंट्स से बनने वाले टोकन का एक क्रम है जो JSON मूल्य व्याकरण के अनुरूप है। टोकन के सेट में छह संरचनात्मक टोकन, तार, संख्या और तीन शाब्दिक नाम टोकन शामिल हैं। ऐसा लगता है कि ऐसा कुछ वैध है: {"1234"}, {सत्य}। हालाँकि यह क्या दर्शाता है? यह कोई सरणी नहीं है, क्योंकि कोई <code> [] </ code> नहीं है, न ही यह एक ऑब्जेक्ट है, क्योंकि उनमें से दो हैं।
निकोलस हम्फ्री

1
@NicholasHumphrey जो मैंने ऊपर लिखा था वह अभी भी 8259 में लागू होता है। उसी खंड 2 (JSON व्याकरण) में JSON-text (a JSON दस्तावेज़) को इस प्रकार परिभाषित किया गया है: JSON-text = ws value wsजहाँ "A JSON मान होना आवश्यक है एक वस्तु, सरणी, संख्या, या स्ट्रिंग। या निम्नलिखित तीन शाब्दिक नामों में से एक: गलत, अशक्त, सही "प्रति धारा 3 (मान)। आपका उदाहरण उन बाधाओं को संतुष्ट नहीं करता है और इसलिए JSON मान्य नहीं है।
रिचर्ड मार्सेल - Drackir

8

यदि आप जिस स्ट्रिंग को पार्स कर रहे हैं, वह बाएं ब्रेस से शुरू होती है ([) आप JSONArray.parseएक JSONArray ऑब्जेक्ट को वापस पाने के लिए उपयोग कर सकते हैं और फिर आप उपयोग कर सकते हैं get(i)जहाँ मैं JSONArray के माध्यम से 0 से एक इंडेक्स है size()-1

import java.io.IOException;
import com.ibm.json.java.JSONArray;
import com.ibm.json.java.JSONObject;

public class BookListTest {
   public static void main(String[] args) {
      String jsonBookList = "{\"book_list\":{\"book\":[{\"title\":\"title 1\"},{\"title\":\"title 2\"}]}}";
      Object book_list;
      try {
         book_list = JSONObject.parse(jsonBookList);
         System.out.println(book_list);
         Object bookList = JSONObject.parse(book_list.toString()).get("book_list");
         System.out.println(bookList);
         Object books = JSONObject.parse(bookList.toString()).get("book");
         System.out.println(books);
         JSONArray bookArray = JSONArray.parse(books.toString());
         for (Object book : bookArray) {
            System.out.println(book);
         }
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

जैसे उत्पादन का उत्पादन:

{"book_list":{"book":[{"title":"title 1"},{"title":"title 2"}]}}
{"book":[{"title":"title 1"},{"title":"title 2"}]}
[{"title":"title 1"}, {"title":"title 2"}]
{"title":"title 1"}
{"title":"title 2"}

नोट: यदि आपने कॉल करने का प्रयास किया है तो आपको JSONObject.parse(books.toString());वह त्रुटि मिलेगी जो आपके सामने थी:

java.io.IOException: Expecting '{' on line 1, column 2 instead, obtained token: 'Token: ['

1
अधिक सरल कोड Instof JSONArray बनाम Instof JSONObject ऑब्जेक्ट का उपयोग करने के लिए निर्धारित कॉल से लौटाया जा सकता है कि किस वर्ग को वस्तु को पार्स करने के लिए इस्तेमाल किया जाना चाहिए ...
Nathaniel Mills

5

JSON.ORG WEBSITE SAYS ....

https://www.json.org/

साइट स्पष्ट रूप से निम्नलिखित बताती है:

JSON दो संरचनाओं पर बनाया गया है:

  1. नाम / मूल्य जोड़े का एक संग्रह। विभिन्न भाषाओं में, यह एक वस्तु, रिकॉर्ड, संरचना, शब्दकोश, हैश टेबल, की-लिस्ट, या साहचर्य सरणी के रूप में महसूस किया जाता है।

  2. मूल्यों की एक क्रमबद्ध सूची। अधिकांश भाषाओं में, यह एक सरणी, वेक्टर, सूची या अनुक्रम के रूप में महसूस किया जाता है।

ये सार्वभौमिक डेटा संरचनाएं हैं। वस्तुतः सभी आधुनिक प्रोग्रामिंग भाषाएं उन्हें एक या दूसरे रूप में समर्थन करती हैं। यह समझ में आता है कि प्रोग्रामिंग भाषाओं के साथ विनिमेय होने वाला डेटा प्रारूप भी इन संरचनाओं पर आधारित है। JSON में, वे इन रूपों को लेते हैं:

वस्तु:

एक वस्तु नाम / मूल्य जोड़े का एक अनियंत्रित सेट है। एक वस्तु {(बाएं ब्रेस) से शुरू होती है और} (दाएं ब्रेस) के साथ समाप्त होती है। प्रत्येक नाम के बाद होता है: (बृहदान्त्र) और नाम / मान जोड़े अलग हो जाते हैं, (अल्पविराम)।

{string: value, string: value}

ARRAY:

एक सरणी मानों का एक ऑर्डर किया गया संग्रह है। एक सरणी [(बाएं ब्रैकेट) के साथ शुरू होती है और] (दाएं ब्रैकेट) के साथ समाप्त होती है। मान (अल्पविराम) द्वारा अलग किए जाते हैं।

[value, value, value ….]

मूल्य:

एक मूल्य दोहरे उद्धरण चिह्नों, या एक संख्या, या सही या गलत या अशक्त, या एक वस्तु या एक सरणी में एक स्ट्रिंग हो सकता है। इन संरचनाओं को नस्ट किया जा सकता है।

STRING:

एक स्ट्रिंग शून्य या अधिक यूनिकोड वर्णों का एक क्रम है, जो दोहरे उद्धरण चिह्नों में लिपटा है, बैकस्लैश एस्केप का उपयोग करता है। एक चरित्र को एकल वर्ण स्ट्रिंग के रूप में दर्शाया जाता है। एक स्ट्रिंग बहुत सी या जावा स्ट्रिंग की तरह है।

संख्या:

एक संख्या बहुत सी या जावा संख्या की तरह है, सिवाय इसके कि ऑक्टल और हेक्साडेसिमल प्रारूपों का उपयोग नहीं किया जाता है।

WHITESPACE के बारे में:

किसी भी जोड़ी टोकन के बीच व्हॉट्सएप डाला जा सकता है। कुछ एन्कोडिंग विवरणों को छोड़कर, जो पूरी तरह से भाषा का वर्णन करता है।


उदाहरणों के साथ अच्छा; इसने मुझे JSON सत्यापनकर्ता के लिए अपनी इकाई परीक्षा लिखने में मदद की। मुझे यकीन नहीं था कि स्ट्रिंग का क्या मतलब था (जैसे। यह दोहरे उद्धरण के अंदर एक स्ट्रिंग होना चाहिए)।
गिमिकेल

मैं देखता हूं कि यह कैसे भ्रमित किया जा सकता है, वाक्य कुछ अधिक संक्षिप्त रूप में शुरू हो सकता है: "शून्य या अधिक यूनिकोड वर्णों का एक क्रम ...." मुझे विश्वास है कि लेखक ने जोर देने के लिए इसे जोड़ा हो सकता है। मैंने इसे इस तरह से निर्धारित किया कि कुछ महत्वपूर्ण बिंदुओं को देखना आसान हो गया। हालांकि एक देर से प्रतिक्रिया, मुझे उम्मीद है कि जरूरत पड़ने पर कुछ स्पष्टता जोड़ता है।
जे। मोरेनो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.