开发者

Regex to replaces slashes inside of JSON

开发者 https://www.devze.com 2023-04-01 08:55 出处:网络
I have some JSON I am parsing that looks like this: { \"dhkplhfnhceodhffomolpfigojocbpcb\": { \"external_crx\": \"C:\\Program Files\\Babylon\\Babylon-Pro\\Utils\\BabylonChrome.crx\",

I have some JSON I am parsing that looks like this:

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

Unfortunately, JSON.NET does gives me an error because of the single slashes. Is there a way to either allow single slashes? If not, what is a Regex I can use to开发者_StackOverflow社区 double slash the filepath in a safe way with out messing up other entries that might have the correct double slash?

Update The error (using JsonTextReader) is "Bad JSON escape sequence: \P. Line 4, position 25." It turns out there is more that meets the eye on this issue, because the backslash is there to support hex and octal values (http://json.codeplex.com/discussions/244265). How will I know when I'm looking at a hex/octal and not just a filepath backslash that someone forgot to double backslash?

                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;


To replace single backslashes with double backslashes, but leave existing doubles alone, search for

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

and replace that with

\\\\

For C#, RegexBuddy creates this code snippet:

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);


What is the Error? what is your deserializeObject?

If you use something like :

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

You shouldn't have any problems.

0

精彩评论

暂无评论...
验证码 换一张
取 消