传递给字典时,字符未正确转义

时间:2017-04-05 19:00:59

标签: c# json visual-studio escaping

在将此标记为重复之前,具有相似名称的其他问题与正则表达式相关,并且与我的问题不同。

我有字符串

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

如果我没弄错,这应该逃到{"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"}
}

为什么它会保留引号和转义字符?我在这里做错了什么?

2 个答案:

答案 0 :(得分:5)

您的Principal是一个字符串,因此将其作为一个字符串进行转义。

如果要将其作为JSON对象转义,它也必须是应用程序中的对象。

如果您还要反序列化或多次使用它,我建议在类中定义您的对象。如果没有,您可以使用匿名对象:

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

/ edit:这是一个非匿名类:

班级定义:

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);

答案 1 :(得分:3)

添加到@ Compufreak&#39; s answer的一个选项。

您对JsonConvert.SerializeObject()的来电表示您已使用。如果你有一个预序列化的JSON文字字符串,你需要按顺序包含,而不是在序列化容器时在某个容器POCO中转义,你可以将字符串包装在JRaw对象中:

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

JsonConvert.SerializeObject()将发出JSON字符串而不进行转义。当然,Principal字符串需要有效 JSON,否则生成的序列化将会很糟糕。

示例fiddle