2017-04-05 4 views
1

これが重複としてマークされる前に、同様の名前のもう1つの質問は正規表現に関連し、私の問題とは異なります。辞書に渡すときに文字が正しくエスケープされない

私は私が間違っていないよ場合、これは{"id":"number"}に逃げる必要がある文字列

Principal = "{\"id\":\"number\"}" 

を持っています。

私は次のような方法

Dictionary<string, object> folder = new Dictionary<string, object>(); 
      folder.Add("Principal", Principal); 
      string json = JsonConvert.SerializeObject(folder); 
      Console.WriteLine(json); 

にそれを渡すときしかし、それは理想的には私はそれがなぜそれが保持している

{ 
"Principal":{"id":"number"} 
} 

を返したい

{ 
"Principal":"{\"id\":\"number\"}" 
} 

として返します。引用符とエスケープ文字に?私はここで間違って何をしていますか?

答えて

5

プリンシパルは文字列なので、1文字としてエスケープされます。

JSONオブジェクトとしてエスケープしたい場合は、アプリケーション内のオブジェクトである必要があります。

デシリアライズしたり、複数回使用したい場合は、クラス内でオブジェクトを定義することを提案します。

Dictionary<string, object> folder = new Dictionary<string, object>(); 
folder.Add("Principal", new { id = "number" }); 
string json = JsonConvert.SerializeObject(folder); 
Console.WriteLine(json); 

/編集:いない場合は、あなただけの匿名オブジェクトを使用することができますし、ここで非匿名クラスでそれを次のとおりです。

クラス定義:

class Principal 
{ 
    public string id { get; set; } 
} 

用途:

Dictionary<string, object> folder = new Dictionary<string, object>(); 
folder.Add("Principal", new Principal(){ id = "number" }); 
string json = JsonConvert.SerializeObject(folder); 
Console.WriteLine(json); 
+0

優秀、ありがとうございます!私のコードはまだ動作していませんが、この部分はあなたに感謝です! – Mitch

3

@ Compufreakのanswerに追加するオプションが1つあります。

JsonConvert.SerializeObject()に電話すると、すでにが使用されていることを示します。あなたはコンテナがシリアル化されるいくつかのコンテナPOCOにエスケープせずにそのまま含める必要が事前にシリアル化されたJSON文字列リテラルを使用している場合、あなたはJRawオブジェクト内の文字列をラップすることができます:

folder.Add("Principal", new Newtonsoft.Json.Linq.JRaw(Principal)); 

JsonConvert.SerializeObject()はその後でしょうエスケープせずにJSON文字列を出力します。もちろん、Principal文字列は有効な JSONである必要があります。そうしないと、結果の直列化が悪くなります。

サンプルfiddle

関連する問題