2013-10-07 51 views
2

我想解析一些由(string,string)對構成的JSON對象。我解析的文件包含這個。我想ot模仿resjson行爲。如何獲取Newtonsoft.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 
} 

當我得到的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」字符串a nd我無法知道原始文件的樣子。有沒有一種方法來保護字符逃跑?

+0

如果初始化值爲「\ u0040 @」的字符串並檢索它ain會顯示爲「@ @」的值。 – Manvik

+1

@SergiuMindras你爲什麼需要這個? – Athari

+0

@Athari我想獲得原始字符串的「真實」值,因爲我想根據LineInfo來加下劃線。爲此,我需要字符串的起始位置和結束位置,但LineInfo只返回LinePosition和LineNumber(行和列)。 –

回答

0

那麼,一個簡單的想法是把它傳遞給解析器之前逃脫原文所有的反斜線:

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

問題是這樣我可能會弄亂其他值,儘管它適用於這種特殊情況。 我可能有一些其他的值「\ b somestring」,「\ f otherstring」等。 –

+0

這些值如何被搞砸?你是說你只想逃避爲'\ u'保存?如果是這樣,只需更改Replace語句以查找那個'(@「\ u」,@「\\ u」)'。當我有字符串「\\ u0040」時, –

+0

(@「\ u」,@「\\ u」)弄虛作假。 它會變成「\\\ u0040」,它將被解析爲「\ @」 –

0

使用Newtonsoft.Json,你實際上可以做:

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

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

它不會顯示反序列化時丟失的原始字符串,但會將所有非ascii字符編碼爲\ uXXXX