diff --git a/src/parsers/json/Reader.php b/src/parsers/json/Reader.php index 148ac35..179e40e 100644 --- a/src/parsers/json/Reader.php +++ b/src/parsers/json/Reader.php @@ -84,7 +84,7 @@ public function parse() { private function parseRecursive() { $sb = ""; while (false !== ($c = $this->in->nextChar())) { - if ($c != self::SPACE_CHAR && $c != self::TAB_CHAR) { + if ($c != self::SPACE_CHAR && $c != self::TAB_CHAR && $c != "\r" && $c != "\n") { $p = $this->parseStructure($c); $o = $p->getRight(); $c = $p->getLeft(); @@ -132,12 +132,15 @@ private function parseStructure($c) { if ($c == self::END_MAP) { $this->queue->dequeue(); $cl = $this->conf->getString(Configuration::CLASS_PROPERTY, Configuration::DEFAULT_CLASS_PROPERTY_VALUE); + $p = new Pair($c, $m); if (isset($m[$cl])) { $o = $this->createClass($m); - $c = $this->in->nextChar(); - return new Pair($c, $o); + $p = new Pair($c, $o); } - return new Pair($c, $m); + if (false !== ($ch = $this->in->nextChar())) { + $p->setLeft($ch); + } + return $p; } break; case self::START_ARRAY: @@ -146,7 +149,9 @@ private function parseStructure($c) { $c = $this->parseList($l); if ($c == self::END_ARRAY) { $this->queue->dequeue(); - $c = $this->in->nextChar(); + if (false !== ($ch = $this->in->nextChar())) { + $c = $ch; + } return new Pair($c, $l); } break; @@ -213,13 +218,13 @@ private function parseMap(&$m) { while (false !== ($c = $this->in->nextChar())) { if ($c == self::END_MAP) { return $c; - } else { + } else if ($c != self::SPACE_CHAR && $c != self::TAB_CHAR && $c != "\r" && $c != "\n") { $sb = ""; // searching key do { if ($c === false) throw new \Exception("Reached end of stream - un-parsed data"); - if ($c != self::ELEM_DELIM) + if ($c != self::ELEM_DELIM && $c != "\r" && $c != "\n") $sb = $sb . $c; } while (false !== ($c = $this->in->nextChar()) && $c != self::VALUE_DELIM); $key = trim($sb); @@ -251,7 +256,7 @@ private function parseList(&$l) { while (false !== ($c = $this->in->nextChar())) { if ($c == self::END_ARRAY) { return $c; - } else if ($c == self::ELEM_DELIM || $c == self::VALUE_DELIM) { + } else if ($c == self::SPACE_CHAR || $c == self::TAB_CHAR || $c == self::ELEM_DELIM || $c == self::VALUE_DELIM || $c == "\r" || $c == "\n") { // do nothing } else { $p = $this->parseListInnerElement($c); diff --git a/test/parsers/json/ReaderTest.php b/test/parsers/json/ReaderTest.php index 1d70eef..6c03ffb 100644 --- a/test/parsers/json/ReaderTest.php +++ b/test/parsers/json/ReaderTest.php @@ -105,5 +105,10 @@ public function testParse() { $this->assertEquals("grinfeld\\phpjsonable\\utils\\Pair", get_class($result), "should " . get_class($result) . " == grinfeld\\phpjsonable\\utils\\Pair"); $this->assertEquals(100, $result->getLeft(), "should " . $result->getLeft() . " == 100"); $this->assertEquals("Test", $result->getRight(), "should " . $result->getRight() . " == Test"); + + $str = " {\r\n\"key1\": \"hello\"\r\n }"; + $fp = new StringInputStream($str); + $res = (new Reader($fp))->parse(); + $this->assertEquals("hello", $res["key1"], "should " . $res["key1"] . " == hello"); } } \ No newline at end of file