2011-08-30 95 views
2

裏面我有一些JSON我解析,看起來像這樣:正則表達式來替換斜線JSON

{ 
    "dhkplhfnhceodhffomolpfigojocbpcb": { 
    "external_crx": "C:\Program Files\Babylon\Babylon-Pro\Utils\BabylonChrome.crx", 
    "external_version": "1.1" 
    } 
} 

不幸的是,JSON.NET確實給了我一個錯誤,因爲單斜線。有沒有辦法讓單斜槓?如果不是的話,我可以使用什麼正則表達式來以一種安全的方式對文件路徑進行雙斜槓,而不用搞亂可能有正確雙斜槓的其他條目?

更新錯誤(使用JsonTextReader)是「錯誤的JSON轉義序列:\ P。第4行,位置25」。事實證明,在這個問題上還有更多需要注意的地方,因爲反斜槓在那裏支持十六進制和八進制值(http://json.codeplex.com/discussions/244265)。我如何知道何時我正在查看十六進制/八進制數,而不僅僅是一個文件路徑反斜槓,有人忘記了反斜槓?

   case 'u': 
       // ... 
      case 'x': 
       hexValues = new char[2]; 
       for (int i = 0; i < hexValues.Length; i++) 
       { 
        if ((currentChar = MoveNext()) != '\0' || !_end) 
         hexValues[i] = currentChar; 
        else 
         throw CreateJsonReaderException("Unexpected end while parsing unicode character. Line {0}, position {1}.", _currentLineNumber, _currentLinePosition); 
       } 

       hexChar = Convert.ToChar(int.Parse(new string(hexValues), NumberStyles.HexNumber, NumberFormatInfo.InvariantInfo)); 
       _buffer.Append(hexChar); 
       break; 

      default: 
       var octValues = new char[3]; 
       var octLength = 0; 
       for (int i = 0; i < octValues.Length; i++) 
       { 
        var octalChar = i==0 ? currentChar : PeekNext(); 
        if ((octalChar > 1 || !_end) && octalChar>='0' && octalChar<'8') 
        { 
         octValues[i] = (char)octalChar; 
         if(i!=0) MoveNext(); 
         octLength++; 
        } 
        else 
        { 
         break; 
        } 
       } 
       if (octLength>0) 
       { 
        hexChar = Convert.ToChar(Convert.ToInt32(new string(octValues, 0, octLength), 8)); 
        _buffer.Append(hexChar); 
        break; 
       } 

       throw CreateJsonReaderException("Bad JSON escape sequence: {0}. Line {1}, position {2}.", @"\" + currentChar, _currentLineNumber, _currentLinePosition); 
      } 
     } 
     else 
     { 
      throw CreateJsonReaderException("Unterminated string. Expected delimiter: {0}. Line {1}, position {2}.", quote, _currentLineNumber, _currentLinePosition); 
     } 
     break; 
+0

你可以發佈你指的整個代碼塊嗎? – Chandu

回答

7

要使用雙反斜槓代替單反斜線,而是獨自離開現有的雙打,搜索

(?<!\\)\\(?!\\) 

,並替換成

\\\\ 

對於C#,使用RegexBuddy創建此代碼片段:

resultString = Regex.Replace(subjectString, 
    @"(?<!\\) # lookbehind: Check that previous character isn't a \ 
    \\   # match a \ 
    (?!\\)  # lookahead: Check that the following character isn't a \", 
    @"\\", RegexOptions.IgnorePatternWhitespace); 
+0

我終於使用(?<!\\)\\(?![\\ 0-9xu]) – tofutim

+0

我需要upvote它 - 如果你編輯,我可以做到,只是我的錯誤實施它(沒有第一次工作)。 – tofutim

0

什麼是錯誤? 你的deserializeObject是什麼?

如果你使用類似:

data = JsonConvert.DeserializeObject<Dictionary<Object, Object>>(jsonText); 

你不應該有任何問題。

+0

我正在使用JsonTextReader。錯誤是(通常)錯誤的JSON轉義序列:\ P。第4行,第25位。 – tofutim