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