Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Regex to validate JSON

Tags:

json

regex

I am looking for a Regex that allows me to validate json.

I am very new to Regex's and i know enough that parsing with Regex is bad but can it be used to validate?

like image 500
Shard Avatar asked Apr 06 '10 08:04

Shard


People also ask

Is regex valid JSON?

Yes, a complete regex validation is possible. Most modern regex implementations allow for recursive regexpressions, which can verify a complete JSON serialized structure.

Can you validate JSON?

The simplest way to check if JSON is valid is to load the JSON into a JObject or JArray and then use the IsValid(JToken, JsonSchema) method with the JSON Schema. To get validation error messages, use the IsValid(JToken, JsonSchema, IList<String> ) or Validate(JToken, JsonSchema, ValidationEventHandler) overloads.

Which of the syntax is correct for defining JSON?

JSON Syntax RulesData is in name/value pairs. Data is separated by commas. Curly braces hold objects. Square brackets hold arrays.


1 Answers

Yes, a complete regex validation is possible.

Most modern regex implementations allow for recursive regexpressions, which can verify a complete JSON serialized structure. The json.org specification makes it quite straightforward.

$pcre_regex = '   /   (?(DEFINE)      (?<number>   -? (?= [1-9]|0(?!\d) ) \d+ (\.\d+)? ([eE] [+-]? \d+)? )          (?<boolean>   true | false | null )      (?<string>    " ([^"\\\\]* | \\\\ ["\\\\bfnrt\/] | \\\\ u [0-9a-f]{4} )* " )      (?<array>     \[  (?:  (?&json)  (?: , (?&json)  )*  )?  \s* \] )      (?<pair>      \s* (?&string) \s* : (?&json)  )      (?<object>    \{  (?:  (?&pair)  (?: , (?&pair)  )*  )?  \s* \} )      (?<json>   \s* (?: (?&number) | (?&boolean) | (?&string) | (?&array) | (?&object) ) \s* )   )   \A (?&json) \Z   /six    '; 

It works quite well in PHP with the PCRE functions . Should work unmodified in Perl; and can certainly be adapted for other languages. Also it succeeds with the JSON test cases.

Simpler RFC4627 verification

A simpler approach is the minimal consistency check as specified in RFC4627, section 6. It's however just intended as security test and basic non-validity precaution:

  var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(          text.replace(/"(\\.|[^"\\])*"/g, ''))) &&      eval('(' + text + ')'); 
like image 186
mario Avatar answered Sep 24 '22 21:09

mario