JSON सत्यापनकर्ता लिखें


12

एक प्रोग्राम लिखें जो यह निर्धारित करता है कि उसका इनपुट वैध JSON है या नहीं ।

  • इनपुट: ASCII टेक्स्ट:[\x00-\x7F]*

    नोट: यदि ASCII समस्याग्रस्त है, तो एक और एन्कोडिंग का उपयोग करने के लिए स्वतंत्र महसूस करें, लेकिन इसे अपनी पोस्ट में इंगित करें।

  • आउटपुट: Valid या Invalid। अनुगामी न्यूलाइन को छोड़ा जा सकता है।

  • उदाहरण:

    $ echo '{"key": "value"}' | ./json-validate
    Valid
    $ echo '{key: "value"}' | ./json-validate
    Invalid
    
  • नियम:

    • JSON पार्सिंग लाइब्रेरी का उपयोग न करें।
    • आंशिक रूप से सही समाधानों की अनुमति है, लेकिन उस पर ध्यान केंद्रित किया गया।
    • अपना टेस्ट सूट स्कोर पोस्ट करें (नीचे देखें)।

सबसे छोटा सही समाधान जीतता है।

कृपया अपने प्रोग्राम पर json-validate-test-suite.sh चलाएं , और अपना स्कोर पोस्ट करें। उदाहरण:

$ ./json-validate-test-suite.sh ./buggy-prog
fail: should be invalid:  [ 0.1e ] 
fail: should be invalid:  [ 0.1e+-1 ] 
fail: should be invalid:  [ 0.1e-+1 ] 
score: 297/300

संसाधन:

  • json.org - JSON व्याकरण की संक्षिप्त परिभाषा आसान करने के लिए चित्रों का पालन करें।
  • RFC 4627 - JSON विनिर्देशन
  • json-validate.c - एक 200-लाइन कार्यान्वयन जो पास हो जाता है।

JSON व्याकरण इस प्रकार है:

json: object | array

object: '{' members? '}'
    members: pair (',' pair)*
    pair:    string ':' value

array: '[' elements? ']'
    elements: value (',' value)*

value: string
     | number
     | object
     | array
     | 'true'
     | 'false'
     | 'null'

string: '"' char* '"'
    char: [^"\\\x00-\x1F]
        | '\' escape
    escape: ["\\/bfnrt]
          | u [0-9A-Fa-f]{4}

number: '-'? (0 | [1-9][0-9]*) ('.' [0-9]+)? ([Ee] [+-]? [0-9]+)?

इसके अलावा, व्हॉट्सएप छह संरचनात्मक पात्रों में से किसी के पहले या बाद में दिखाई दे सकता है {}[]:,

ws = [\t\n\r ]*

निम्नलिखित को ध्यान में रखें:

  • जैसे कार्यों से सावधान रहें isspace()। JSON में व्हॉट्सएप है [\t\n\r ], लेकिन अंतरिक्ष के रूप में (ऊर्ध्वाधर टैब) और (फॉर्म फ़ीड) isspace()भी मानता है। हालाँकि, शब्द में वह है जो केवल से अधिक स्वीकार कर सकता है, यहाँ उपयोग करने के लिए ठीक होना चाहिए, क्योंकि हम मानते हैं कि इनपुट ASCII में है।\v\fisdigit()[0-9]
  • \x7Fतकनीकी रूप से एक नियंत्रण चरित्र है, लेकिन JSON RFC इसका उल्लेख नहीं करता है (यह केवल उल्लेख करता है [\x00-\x1F]), और अधिकांश JSON पार्सर्स को \x7Fतार में वर्ण स्वीकार करते हैं। इस अस्पष्टता के कारण, समाधान या तो उन्हें स्वीकार करने के लिए चुन सकते हैं या नहीं।

7
आपके "आंशिक रूप से सही समाधानों की अनुमति" नोट मुझे एक आनुवंशिक एल्गोरिथ्म से एक रेगीक्स निकालने का सपना दिखा रहा है। मैं पागल होना चाहिए।
जेबी

@ जेबी: यह भयानक होगा।
जॉय एडम्स

बस जिज्ञासु, {key: "value"}अमान्य JSON क्यों माना जाता है? यह मान्य जावास्क्रिप्ट है।
HoLyVieR

@HoLyVieR: मुझे लगता है कि यह JSON पार्स करने में आसान होगा और कार्यान्वयनकर्ताओं के लिए कम अस्पष्ट होगा। मुझे यकीन नहीं है कि मुझे यह प्रतिबंध पसंद है।
जॉय एडम्स

किसी को सत्यापनकर्ता स्क्रिप्ट की एक प्रति मिली?
आर्मंड

जवाबों:


7

PHP: 297 285 264 253 वर्ण

<?=preg_match(<<<'R'
~([\h
]*)({(?1)((("([^"\\\0- ]| |\\(["\\/bfnrt]|u[\dA-Fa-f]{4}))*")(?1):(?1)((?5)|-?(0|[1-9]\d*)(\.\d+)?([Ee][+-]?\d+)?|(?2)|true|false|null))(((?1),(?1))(?4))*)?}|\[(?1)((?8)((?13)(?8))*)?(?1)])(?1)\z~A
R
,`cat`)?'Valid':'Invalid';

स्कोर: 300/300

यह JSON व्याकरण का पूर्ण, पुनरावर्ती कार्यान्वयन है।

यह केवल PHP due 5.3 पर काम करता है क्योंकि Nowdoc सिंटैक्स के कारण ( heredoc को सभी को दोगुना करना होगा \)।

पठनीय संस्करण:

(यह वही रेगेक्स है, जिसका नाम कैप्चर ग्रुप्स और विस्तारित सिंटैक्स है):

#!/usr/bin/env php
<?php

$re = <<< 'RE'
~\A (?P<ws>[\t\n\r ])* (
    (?P<object>\{ (?P>ws)*
        (?P<members>
            (?P<pair>
                (?P<string>
                    "(?P<char>
                        [^"\\\x00-\x1F]
                        |\\(?P<escape>
                            ["\\/bfnrt]
                            |u [0-9A-Fa-f]{4}
                        )
                    )*"
                ) (?P>ws)* : (?P>ws)* (?P<value>
                    (?P>string)
                    | (?P<number>-? (0 | [1-9][0-9]*) (\. [0-9]+)? ([Ee] [+-]? [0-9]+)? )
                    | (?P>object)
                    | (?P>array)
                    | true
                    | false
                    | null
                )
            ) ( (?P>ws)* , (?P>ws)* (?P>pair) )*
        )?
    \})
    |(?P<array>\[ (?P>ws)*
        (?P<elements>
            (?P>value) ( (?P>ws)* , (?P>ws)* (?P>value) )*
        )?
    (?P>ws)* \])
) (?P>ws)* \z~x
RE;

if (preg_match($re, stream_get_contents(STDIN))) {
    echo 'Valid';
} else {
    echo 'Invalid';
}

वाह। `` `` ``
नाथन उस्मान

आपको <?phpIMO को शामिल करना होगा ।
अनाम कायर

जोड़ा गया। 264 चार्ट्स अब :-)
अरनौद ले ब्लांक

5

पायथन - 340 314 299 292 वर्ण

import re,os
r=x=re.sub
z=r('0\.0+','0',r('e[+-]?0+|[\t\n\r]',' ',r(r'"(\\["nrtb\\/]|[^\\"\0-\37])*"','1',r(r'true|false|null|\\u\w{4}|[1-9]\d*','0',os.read(0,99)))))
while z!=x:z,x=r('\{(1:\d)?(,\\1)*\}|\[(-?\d(,-?\d)*)?\]','0',r(' *([][{}:,]) *','\\1',z)),z
print['Inv','V'][z=='0']+'alid'

स्कोर

$ ./json-validate-test-suite.sh ./codegolf-474.py
score: 300/300

3

स्काला - 390 वर्ण

import scala.util.parsing.combinator.JavaTokenParsers
object J extends JavaTokenParsers{def j=o|a
def o:Parser[Any]="{"~repsep(p,",")~"}"
def p=s~":"~v
def a:Parser[Any]="["~repsep(v,",")~"]"
def v=s|o|a|"true"|"false"|"null"
def s=stringLiteral
def n=floatingPointNumber}
object Main{def main(a:Array[String]){print(if(J.parseAll(J.j,readLine()).successful)"Valid"else"Invalid")}}

यह नो-ब्रेनर विलेटन है, जो पार्सर कॉम्बिनेटर्स का उपयोग करता है। शाब्दिक रूप से 1 या 2 मिनट में लिखा गया। सत्यापनकर्ता स्क्रिप्ट प्राप्त नहीं कर सकता, ब्राउज़र ने कहा कि सर्वर नहीं मिला।


एक दिलचस्प समाधान की तरह लग रहा है; सत्यापनकर्ता लिंक को ठीक कर दिया गया है।
आर्मंड

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