2014-09-03 65 views
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個\\

+0

JSON掃描儀?就像[「解析器」](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse)的種類?那會很整潔! – Anthony 2014-09-03 07:10:50

+0

@Anthony是的,就像一個解析器,所以基本上它需要一個包含json對象的字符串,並且通過它進行掃描,就像Java的Scanner類一樣。 – 2014-09-03 07:14:13

+0

所以字符串可能是無效的JSON,但有一個有效的JSON字符串,它會修剪掉壞的部分和解析? – Anthony 2014-09-03 07:29:44

回答

2
$str = '{"a\\":1,"b":2}'; 

這是一個PHP字符串字面值,它有自己的轉義規則。你與上述表示實際的字符串是:

{"a\":1,"b":2} 

如果你想表示一個PHP字符串字面一個反斜槓,你需要寫反斜槓。所以,你想要的東西了正確的字符串表示:

$str = '{"a\\\\":1,"b":2}'; 

它發生與三個反斜槓工作,因爲\\成爲一個\,不跟任何特殊字符的下\,所以它本身也代表一個反斜槓。