首页 > 解决方案 > C#:如何在 json 的引号内使用括号?

问题描述

我有这个 json 文件:

{
    "TestString": "This is a \"{Test}\""
}

如果它不存在,我会自动生成它。

例如,这是一个 C#-Code,我直接使用字符串:

class Programm
{
    static void Main()
    {
        string s = "{ \"TestString\": \"This is a \"{test}\"\"}";

        Test test = JsonConvert.DeserializeObject<Test>(s);
    }
}

现在的问题是,字符串不能以这种方式工作,因为 C# 会将引号变为文字,然后将其存储在 中string s,从而导致

"{ "TestString": "This is a "{test}""}"

这是一个错误的 json 字符串,导致引号没有被转义。

static void Main()
{
    string s = @"{ ""TestString"": ""This is a ""{test}""""}";

    Test test = JsonConvert.DeserializeObject<Test>(s);
}

使整个字符串成为文字结果相同。

有什么我错过了吗?

标签: c#json

解决方案


\"{test}\"添加转义引号,以便 C# 不会终止字符串,但会破坏 JSON。要转义 JSON 中的引号,您还需要添加转义的反斜杠\\,并且 JSON 应该是:

string s = "{ \"TestString\": \"This is a \\\"{test}\\\"\"}";

生成正确 JSON 的更好方法是序列化匿名对象(除非您有适当的模型。

var model = new { TestString = "This is a \"{test}\""};
string s = JsonConvert.SerializeObject(model);
Test test = JsonConvert.DeserializeObject<Test>(s);

注意:您也可以使用逐字字符串

对于逐字字符串,斜线只是一个斜线,而不是转义字符。要嵌入引号,请使用双双引号 ( "")。还保留了换行符,允许您轻松创建多行字符串,而无需回车 ( \r) 和换行符 ( \n) 的组合。它们通常更容易阅读 - 请注意字符串末尾的 4 个双引号序列。

    string s = @"{ ""TestString"": ""This is a \""{test}\""""}";

推荐阅读