如何获取Newtonsoft.Json反序列化值的未转换字符串值?

如何获取Newtonsoft.Json反序列化值的未转换字符串值?,json,escaping,json.net,json-deserialization,Json,Escaping,Json.net,Json Deserialization,我试图解析一些JSON对象,这些对象仅仅由(字符串,字符串)对组成。我正在解析的文件包含以下内容。我不想模仿别人的行为 { "first_key": "first_value", "unicode": "\u0040 @" } 我所做的是 string path = @"d:\resjson\example.resjson"; string jsonText = File.ReadAllText(path); IDictionary<string, string> dic

我试图解析一些JSON对象,这些对象仅仅由(字符串,字符串)对组成。我正在解析的文件包含以下内容。我不想模仿别人的行为

{
  "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
}
这对我来说是:

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

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

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

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

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

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

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

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

如果使用值“\u0040@”初始化字符串并再次检索它,则会将该值显示为“@”.@SergiuMindras为什么需要这个?@Athari我想获得原始字符串的“true”值,因为我想根据LineInfo在它下面划线。为此,我需要字符串的起始位置和结束位置,但LineInfo只返回LinePosition和LineNumber(line和column)。@Manvik但当您从文件中读取时,应将其读取为“\\u0040@”。它不会将字符串初始化为“\u0040@”,而将“\u0040”解释为单个字符。File.ReadAllText(path)按原样读取字符。如果我打开记事本并写入“\u0040@”,我希望程序知道它必须在8个字符下划线,而不是在3个字符下划线。问题是,这样可能会弄乱其他值,尽管它适用于这种特殊情况。我可能还有一些其他值“\b somestring”、“\f otherstring”等,这些值会被弄乱吗?您是说您只希望为
\u
保留转义吗?如果是这样,只需更改Replace语句以查找
(@“\u”,“@”\\u”)
(@“\u”,“@”\\u”)在我有字符串“\\u0040”时会弄乱大小写。它将变成“\\\u0040”,并被解析为“\@”
var settings = new JsonSerializerSettings()
{
    StringEscapeHandling = StringEscapeHandling.EscapeNonAscii
};

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