1
0
Fork 0

Merge pull request #256 from hason/jsonencode

JsonFile - changed "encode" method to static and added detection of missing colon in json
pull/248/merge
Jordi Boggiano 2012-01-24 13:27:49 -08:00
commit 20222a04bc
2 changed files with 25 additions and 4 deletions

View File

@ -92,7 +92,7 @@ class JsonFile
); );
} }
} }
file_put_contents($this->path, $this->encode($hash, $prettyPrint)); file_put_contents($this->path, static::encode($hash, $prettyPrint));
} }
/** /**
@ -105,7 +105,7 @@ class JsonFile
* @param Boolean $prettyPrint If true, output is pretty-printed * @param Boolean $prettyPrint If true, output is pretty-printed
* @return string Indented version of the original JSON string * @return string Indented version of the original JSON string
*/ */
public function encode(array $hash, $prettyPrint = true) static public function encode(array $hash, $prettyPrint = true)
{ {
if ($prettyPrint && defined('JSON_PRETTY_PRINT')) { if ($prettyPrint && defined('JSON_PRETTY_PRINT')) {
return json_encode($hash, JSON_PRETTY_PRINT); return json_encode($hash, JSON_PRETTY_PRINT);
@ -181,7 +181,7 @@ class JsonFile
* *
* @return array * @return array
*/ */
public static function parseJson($json) static public function parseJson($json)
{ {
$data = json_decode($json, true); $data = json_decode($json, true);
@ -206,7 +206,7 @@ class JsonFile
$msg .= ', extra comma'; $msg .= ', extra comma';
} elseif (preg_match('#((?<=[^\\\\])\\\\(?!["\\\\/bfnrt]|u[a-f0-9]{4}))#i', $json, $match, PREG_OFFSET_CAPTURE)) { } elseif (preg_match('#((?<=[^\\\\])\\\\(?!["\\\\/bfnrt]|u[a-f0-9]{4}))#i', $json, $match, PREG_OFFSET_CAPTURE)) {
$msg .= ', unescaped backslash (\\)'; $msg .= ', unescaped backslash (\\)';
} elseif (preg_match('#(["}\]]) *\r?\n *"#', $json, $match, PREG_OFFSET_CAPTURE)) { } elseif (preg_match('#(["}\]])(?: *\r?\n *)+"#', $json, $match, PREG_OFFSET_CAPTURE)) {
$msg .= ', missing comma'; $msg .= ', missing comma';
$charOffset = 1; $charOffset = 1;
} elseif (preg_match('#^ *([a-z0-9_-]+) *:#mi', $json, $match, PREG_OFFSET_CAPTURE)) { } elseif (preg_match('#^ *([a-z0-9_-]+) *:#mi', $json, $match, PREG_OFFSET_CAPTURE)) {
@ -215,6 +215,8 @@ class JsonFile
$msg .= ', use double quotes (") instead of single quotes (\')'; $msg .= ', use double quotes (") instead of single quotes (\')';
} elseif (preg_match('#(\[".*?":.*?\])#', $json, $match, PREG_OFFSET_CAPTURE)) { } elseif (preg_match('#(\[".*?":.*?\])#', $json, $match, PREG_OFFSET_CAPTURE)) {
$msg .= ', you must use the hash syntax (e.g. {"foo": "bar"}) instead of array syntax (e.g. ["foo", "bar"])'; $msg .= ', you must use the hash syntax (e.g. {"foo": "bar"}) instead of array syntax (e.g. ["foo", "bar"])';
} elseif (preg_match('#".*?"( *["{\[])#', $json, $match, PREG_OFFSET_CAPTURE)) {
$msg .= ', missing colon';
} }
if (isset($match[1][1])) { if (isset($match[1][1])) {
$preError = substr($json, 0, $match[1][1]); $preError = substr($json, 0, $match[1][1]);

View File

@ -84,6 +84,25 @@ class JsonFileTest extends \PHPUnit_Framework_TestCase
$this->expectParseException('missing comma on line 2, char 21', $json); $this->expectParseException('missing comma on line 2, char 21', $json);
} }
public function testParseErrorDetectMissingCommaMultiline()
{
$json = '{
"foo": "barbar"
"bar": "foo"
}';
$this->expectParseException('missing comma on line 2, char 24', $json);
}
public function testParseErrorDetectMissingColon()
{
$json = '{
"foo": "bar",
"bar" "foo"
}';
$this->expectParseException('missing colon on line 3, char 14', $json);
}
public function testSimpleJsonString() public function testSimpleJsonString()
{ {
$data = array('name' => 'composer/composer'); $data = array('name' => 'composer/composer');