【发布时间】: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;
【问题讨论】:
-
你能贴出你所指的整个代码块吗?