C#中的双引号不允许多行输入。

14
例如。
string str = "{\"aps\":{\"alert\":\"" + title + "" + message + "\"}}";

我需要将它改为更易读的格式:

 string str = "
 {
   \"aps\":
         {
             \"alert\":\"" + title + "" + message + "\"
         }
 }";

请建议如何实现此功能。


你可以使用单引号代替双引号。 - NASSER
@X-TECH:如果楼主想要得到有效的JSON,那么这样做是不行的。 - Jon Skeet
2个回答

40

如果你真的需要在字符串文字中做这件事,我建议使用逐字字符串文字(使用@前缀)。在逐字字符串文字中,您需要使用""来表示双引号。我建议同时使用内插字符串文字,让嵌入titlemessage更加清晰。不过这意味着你需要将{{}}加倍。所以你会有:

string title = "This is the title: ";
string message = "(Message)";
string str = $@"
{{
   ""aps"":
   {{
       ""alert"":""{title}{message}""
   }}
}}";
Console.WriteLine(str);

输出:

{
   "aps":
   {
       "alert":"This is the title: (Message)"
   }
}

然而,这种方法仍比使用JSON API直接构建JSON更脆弱 - 如果标题或消息中包含引号,你最终会得到无效的JSON。例如,我会选择使用Json.NET:

string title = "This is the title: ";
string message = "(Message)";
JObject json = new JObject
{
    ["aps"] = new JObject 
    { 
        ["alert"] = title + message 
    }
};
Console.WriteLine(json.ToString());

在我看来,那样更加简洁明了,而且更加健壮。


@furqanms:抱歉,我不知道你的意思。我提供的代码没有产生任何额外的大括号,而且你使用的代码也不清楚。 - Jon Skeet
抱歉,那是我的错误。JObject 对于可读性非常好。感谢 @Jon Skeet。 - Furqan Misarwala
你的 Json.NET 对我来说是正确的答案,它为我工作并在开发应用程序时帮助了我,所以感谢你的分享。 - Starjumper Tech SL

4
您可以使用 X-Tech 提到的方法,即在每行后面使用附加连接运算符('+'),或者使用符号“@”:
 string str = @"
         {
           'aps':
                 {
                     'alert':'" + title + "" + message + @"'
                 }
         }";

由于它是JSON格式,您可以使用单引号而不是双引号。

关于“@”符号:C#中的多行字符串字面量


1
请注意,在倒数第三行末尾也需要@,因为一个新的多行字符串即将开始。每当您开始一个新的多行字符串时,请放置“@”符号。 - Arvind Sasikumar
3
单引号在 JSON 中实际上并不合法。虽然它们在许多解析器中可以使用,但是它们违反了 https://tools.ietf.org/html/rfc7159。 - Jon Skeet
@JonSkeet 感谢您指出这一点。但我不知道怎样才能只使用双引号,并且不使用单引号就可以得到一个干净的多行字符串... - Arvind Sasikumar
看看我的答案,有几个选项。 - Jon Skeet
@JonSkeet 感谢您的回答,今天我学到了新的东西。 - Arvind Sasikumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接