如何使用字符串插值和逐字字符串一起创建JSON字符串文字?

18

我正在尝试创建一个表示JSON对象数组的字符串字面量,因此我考虑使用下面代码中展示的字符串插值特性:

    public static void MyMethod(string abc, int pqr)
    {
        string p = $"[{{\"Key\":\"{abc}\",\"Value\": {pqr}  }}]";
    }

现在我考虑使用verbatim字符串,这样我就不必使用反斜线来转义双引号。 于是我通过这个答案得知,可以同时使用verbatim字符串和字符串插值。所以我将我的代码更改为以下内容:

public static void MyMethod(string abc, int pqr)
{
    string p = $@"[{{"Key":"{abc}","Value": {pqr} }}]";
}

但是它无法编译。如果在我的用法中有任何错误,或者使用C#字符串字面特性在这种情况下无法转义双引号,是否可以帮助我?

但它未能编译。如果我的用法存在问题,或者使用C#的字符串逐字功能在这种情况下无法转义双引号,是否有人可以帮助我?


2
逐字字符串要求您通过将其加倍来转义双引号。$@"[{{""Key"":""{abc}"",""Value"": {pqr} }}]"可以工作,但这几乎不可读。考虑使用JSON序列化程序以避免字符串操作。 - Jeroen Mostert
1
即使您真的非常不想使用JSON序列化器,我也建议避免以这种方式构建字符串,格式化字符串很快就会变得难以阅读和容易出错。在这种情况下,也许String.Format()可以帮助您,如果您编写更多的函数,那么您将拥有一个漂亮的短小可读的代码片段(QuoteJsonString()ConvertToJsonKeyValuePair()和一行LINQ来连接它们...) - Adriano Repetti
3个回答

15

最好的方法是使用JSON序列化器,因为它们有内置的处理转义字符和其他事项的功能。请参见此处

然而,如果我们只想通过手动创建JSON字符串来实现这一点,那么可以通过将内部双引号更改为单引号来解决:

public static string MyMethod(string abc, int pqr)
{
   string p = $@"[{{'Key':'{ abc}','Value': {pqr} }}]";
   return p;
}

7
这不是有效的JSON格式。单引号在Javascript中是有效的,但在JSON中不是。 - Pete Montgomery
你可以使用双引号来转义引号,即 @" { ""key"": ""value"" } "。然而,尽管手册指示您可以组合 $@ 用于插值的文本字符串,但VSCode告诉我这样做是一个错误。不确定实现它的确切正确语法是什么。 - Eric Blade

2
我同意其他人的看法,从字符串构建它是一个不好的想法。我也理解您不想包含额外的依赖项。
以下是我以前编写的一些代码,用于将字典转换为JSON字符串。它非常基础,只接受字符串类型,并且没有对任何名称/值中的引号进行转义,但这可以相当容易地完成。
如果您正在尝试从基本类型序列化大型JSON字符串,这是我推荐的方法。它会帮助您保持清醒。
private static string DictToJson(Dictionary<string, string> Dict)
{
    var json = new StringBuilder();

    foreach (var Key in Dict.Keys)
    {
        if (json.Length != 0)
            json = json.Append(",\n");

        json.AppendFormat("\"{0}\" : \"{1}\"", Key, Dict[Key]);
    }
    return "{" + json.ToString() + "}";
}

在我的JSON数据中,我也可以有int、date值。但你把每个值都当作字符串处理了。 - RBT

1
你可以使用Json.NET创建字典并将其序列化为JSON。
Dictionary<string, string> values = new Dictionary<string, string>();
values.Add("key1", "value1");
values.Add("key2", "value2");

string json = JsonConvert.SerializeObject(values);
// {
//   "key1": "value1",
//   "key2": "value2"
// }

您可以在此处查看更多详细信息:http://www.newtonsoft.com/json/help/html/SerializingCollections.htm


我将在一个方法中利用这段代码,该方法从installshield的自定义操作中调用。在我的C#项目中添加对JSON.NET dll的依赖将会在installshield项目中也添加对该dll的依赖。这是一项明确的工作,需要付出相当大的开销,只为了修复C#端的这一行代码,如果可以修复的话。 - RBT

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