如何获取Newtonoft.Json反序列化值的非转义字符串值?

时间:2013-10-07 13:22:36

标签: json escaping json.net json-deserialization

我正在尝试解析一些由(字符串,字符串)对组成的JSON对象。我正在解析的文件包含这个。我想要模仿resjson行为。

{
  "first_key": "first_value",
  "unicode": "\u0040 @"
}

我的工作是

string path = @"d:\resjson\example.resjson";
string jsonText = File.ReadAllText(path);

IDictionary<string, string> dict;
try
{
    dict = JsonConvert.DeserializeObject<IDictionary<string, string>>(jsonText);
}
catch(Exception ex)
{
  // log or something
}

当我获得dict对象时,

foreach (var pair in _dict)
{
  string key = pair.Key;
  string value = pair.Value;

  Console.WriteLine("Key = '{0}', Value = '{1}'", key, value);
}

这为我输入:

"Key = 'first_key', Value = 'first_value'"
"Key = 'unicode', Value = '@ @'"

一旦Newtonsoft.Json反序列化对象,我就会丢失“\ u0040”字符串,我无法知道原始文件的样子。有没有办法保留角色逃脱?

2 个答案:

答案 0 :(得分:0)

好吧,一个简单的想法是在将原始文本传递给解析器之前转义原始文本中的所有反斜杠:

dict = JsonConvert.DeserializeObject<IDictionary<string, string>>(
           jsonText.Replace(@"\", @"\\"));

答案 1 :(得分:0)

使用Newtonsoft.Json,您实际上可以这样做:

var settings = new JsonSerializerSettings()
{
    StringEscapeHandling = StringEscapeHandling.EscapeNonAscii
};

var json = JsonConvert.SerializeObject([obj or JToken], settings);

它不会显示原始字符串,因为在反序列化时会丢失,但它会将所有非ascii字符编码为\ uXXXX