একটি JSON বৈধকারক লিখুন


12

এমন কোনও প্রোগ্রাম লিখুন যা নির্ধারণ করে যে এর ইনপুটটি বৈধ JSON কিনা ।

  • ইনপুট: এএসসিআইআই পাঠ্য:[\x00-\x7F]*

    দ্রষ্টব্য: যদি ASCII সমস্যাযুক্ত হয় তবে নির্দ্বিধায় অন্য এনকোডিংটি ব্যবহার করুন, তবে এটি আপনার পোস্টে নির্দেশ করুন।

  • আউটপুট: Valid বা Invalid। চলন্ত নিউলাইন বাদ দেওয়া যেতে পারে।

  • উদাহরণ:

    $ echo '{"key": "value"}' | ./json-validate
    Valid
    $ echo '{key: "value"}' | ./json-validate
    Invalid
    
  • নিয়মাবলী:

    • কোনও JSON পার্সিং লাইব্রেরি ব্যবহার করবেন না।
    • আংশিক-সঠিক সমাধানগুলি অনুমোদিত, তবে তা ভ্রান্ত।
    • আপনার পরীক্ষার স্যুট স্কোর পোস্ট করুন (নীচে দেখুন)।

সবচেয়ে কম সঠিক সমাধান ধিক্কার জানাই।

দয়া করে আপনার প্রোগ্রামে json-uthorate-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 ব্যাকরণের সংক্ষিপ্ত সংজ্ঞা।
  • আরএফসি 4627 - জেএসএন স্পেসিফিকেশন
  • json- validate.c - একটি 200-লাইনের বাস্তবায়ন যা পরীক্ষার পরীক্ষায় উত্তীর্ণ হয়।

জেএসওএন ব্যাকরণটি নিম্নরূপ:

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()। জেএসএনে হোয়াইটস্পেস হ'ল [\t\n\r ]তবে isspace()এটি স্থান হিসাবে \vউল্লম্ব ট্যাব এবং \f(ফর্ম ফিড) আচরণ করে। যদিও শব্দের এমনটি রয়েছে যা কেবলমাত্রের চেয়ে বেশি গ্রহণisdigit() করতে পারে, আমরা এখানে অনুমান করি যে ASCII তে ইনপুট রয়েছে in[0-9]
  • \x7Fপ্রযুক্তিগতভাবে একটি নিয়ন্ত্রণ চরিত্র, তবে জেএসএন আরএফসি এটি উল্লেখ করে না (এটি কেবল উল্লেখ করে [\x00-\x1F]), এবং বেশিরভাগ জেএসএন পার্সার \x7Fস্ট্রিংগুলিতে অক্ষরগুলি স্বীকার করার প্রবণতা পোষণ করে। এই অস্পষ্টতার কারণে সমাধানগুলি সেগুলি গ্রহণ করতে বা না গ্রহণ করতে বেছে নিতে পারে।

7
আপনার "আংশিক-সঠিক সমাধানের অনুমতি দেওয়া" টীকা আমাকে জিনগত অ্যালগরিদম থেকে একটি রেজেক্স বের করার স্বপ্ন দেখিয়ে দিচ্ছে। আমাকে অবশ্যই পাগল হতে হবে।
জেবি

@ জেবি: এটি দুর্দান্ত হবে।
জোয়ে অ্যাডামস

শুধু কৌতূহলী, কেন {key: "value"}অবৈধ জেএসওএন বিবেচনা করা হয়? এটি বৈধ জাভাস্ক্রিপ্ট।
HoLyVieR

@ হোলিভিআর: আমি কল্পনা করেছি যে এটি JSON পার্স করা সহজ এবং বাস্তবায়নকারীদের কাছে কম অস্পষ্ট। আমি নিশ্চিত না যে আমি এই বাধাটি পছন্দ করি like
জোয়ে অ্যাডামস

বৈধকারীর স্ক্রিপ্টের একটি অনুলিপি কেউ পেয়েছেন?
আরমান্ড

উত্তর:


7

পিএইচপি: 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 ব্যাকরণের একটি পূর্ণ, পুনরাবৃত্তিমূলক বাস্তবায়ন।

এটি এখনকার ডড সিনট্যাক্সের কারণে কেবল পিএইচপি ≥ 5.3 এ কাজ করে ( হেরডোকটি সমস্তটি দ্বিগুণ করতে হবে \)।

পঠনযোগ্য সংস্করণ:

(এটি হ'ল নামক ক্যাপচার গ্রুপ এবং বর্ধিত বাক্য গঠন সহ একই রেজেক্স):

#!/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';
}

কি দারুন. `` `` ``
নাথান ওসমান

আপনাকে <?phpআইএমও অন্তর্ভুক্ত করতে হবে ।
বেনামে কাপুরুষোচিত

যোগ করা হয়েছে। 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 মিনিটে লেখা। বৈধকারীর স্ক্রিপ্ট পাওয়া যায় না, ব্রাউজারটি বলে যে সার্ভারটি পাওয়া যায় নি।


একটি আকর্ষণীয় সমাধান মত দেখায়; বৈধকারীর লিঙ্ক স্থির করা হয়েছে।
আরমান্ড

উইন্ডোজে এটি করার কোনও সহজ উপায় আছে? (সাইগউইন বা অনুরূপ মতবিরোধ ছাড়াই)
প্রদর্শিত নাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.