2014-09-03 60 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}'; 

它发生与三个反斜杠工作,因为\\成为一个\,不跟任何特殊字符的下\,所以它本身也代表一个反斜杠。