【问题标题】:Regex to replaces slashes inside of JSON正则表达式替换 JSON 中的斜杠
【发布时间】:2011-08-30 18:04:04
【问题描述】:

我正在解析一些 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;

【问题讨论】:

  • 你能贴出你所指的整个代码块吗?

标签: regex json json.net


【解决方案1】:

要将单反斜杠替换为双反斜杠,但保留现有的双反斜杠,请搜索

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

并将其替换为

\\\\

对于 C#,RegexBuddy 创建此代码 sn-p:

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

【讨论】:

  • 我终于用了(?
  • 我需要支持它 - 如果您编辑,我可以做到,只是我实施它的错误(第一次没有工作)。
【解决方案2】:

什么是错误? 你的反序列化对象是什么?

如果你使用类似的东西:

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

你不应该有任何问题。

【讨论】:

  • 我正在使用 JsonTextReader。错误是(通常)错误的 JSON 转义序列:\P。第 4 行,位置 25。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多