0
我正在编写一个JSONScanner
类,它基本上需要一个字符串并扫描整个事物来构造一个JSONObject
。目前我正在写read_string()
方法,来读取一个字符串。读取转义'\'的字符串时,我得到一些无效的输出。PHP json扫描转义字符
这里是我JSONScanner
类
class JSONScanner {
private $in;
private $pos;
public function __construct($in) {
$this->in = $in;
$this->pos = 0;
}
#########################################################
############### Method used for debugging ###############
#########################################################
public function display() {
$this->pos = 1;
echo $this->read_string($this->get_char());
}
#########################################################
#########################################################
private function read_string($quote) {
$str = "";
while(($c = $this->get_char()) != $quote) {
if($c == '\\') {
$str .= $this->get_escaped_char();
} else {
$str .= $c;
}
}
return $str;
}
private function get_escaped_char() {
$c = $this->get_char();
switch($c) {
case 'n':
return '\n';
case 't':
return '\t';
case 'r':
return '\r';
// display the characters being escaped
case '\\':
case '\'':
case '"':
default:
return $c;
}
}
private function get_char() {
if($this->pos >= strlen($this->in)) {
return -1; // END OF INPUT
}
return substr($this->in, $this->pos++, 1);
}
}
这是我跑的代码
$str = '{"a\\":1,"b":2}';
$jscan = new JSONScanner($str);
$jscan->display();
有了上面的字符串,我得到
a":1,
然而,当我尝试
$str = '{"a\\\":1,"b":2}';
$jscan = new JSONScanner($str);
$jscan->display();
我得到了我所需要的,这是
a\
为什么我需要把2个反斜杠转义反斜线1?
编辑:
我试图在json_decode
同一JSON字符串,它给了我同样的结果,有2个反斜杠,无非有3个backslahes它给了我a\
。这是为什么?是不是逃避反斜杠需要连续2个\\
?
JSON扫描仪?就像[“解析器”](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse)的种类?那会很整洁! – Anthony 2014-09-03 07:10:50
@Anthony是的,就像一个解析器,所以基本上它需要一个包含json对象的字符串,并且通过它进行扫描,就像Java的Scanner类一样。 – 2014-09-03 07:14:13
所以字符串可能是无效的JSON,但有一个有效的JSON字符串,它会修剪掉坏的部分和解析? – Anthony 2014-09-03 07:29:44