3

我正在尝试解析一些仅由 (string,string) 对组成的 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”字符串,并且我无法知道原始文件的外观。有没有办法保留字符转义?

4

2 回答 2

0

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

dict = JsonConvert.DeserializeObject<IDictionary<string, string>>(
           jsonText.Replace(@"\", @"\\"));
于 2013-10-07T16:46:50.760 回答
0

使用 Newtonsoft.Json,您实际上可以执行以下操作:

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

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

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

于 2017-06-02T02:14:47.313 回答