C#字符串插值 - 转义双引号和花括号

Bor*_*s K 11 c# string-interpolation

伙计们,

我正在从插值字符串构建一个JSON对象,而不是获取转义的工作原理.我必须为API使用双引号.

这不会插入花括号之间的表达式:

@"{{
                        ""name"":""{taskName}"", 
                        ""products"": [    
                                    {""product"": ""ndvi_image"", ""actions"": [""mapbox"", ""processed""]}, 
                                    {""product"": ""true_color"", ""actions"": [""mapbox"", ""processed""]}
                                  ], 
                        ""recurring"":true,
                        ""query"":    {
                                        ""date_from"": ""{dateFromString}"",
                                        ""date_to"": ""{dateToString}"",
                                        ""aoi"": {polygon}
                                    },
                        ""aoi_coverage_percentage"":90
                        }}";
Run Code Online (Sandbox Code Playgroud)

这引发了一堆错误 - 显然,大括号没有被正确转义:

$"{{
                        ""name"":""{taskName}"", 
                        ""products"": [    
                                    {""product"": ""ndvi_image"", ""actions"": [""mapbox"", ""processed""]}, 
                                    {""product"": ""true_color"", ""actions"": [""mapbox"", ""processed""]}
                                  ], 
                        ""recurring"":true,
                        ""query"":    {
                                        ""date_from"": ""{dateFromString}"",
                                        ""date_to"": ""{dateToString}"",
                                        ""aoi"": {polygon}
                                    },
                        ""aoi_coverage_percentage"":90
                        }}";
Run Code Online (Sandbox Code Playgroud)

我应该如何格式化它以保留内部双引号和外括号,同时允许插入单个括号内的值?

Igo*_*huk 22

以防万一其他人正在考虑这样做,最好创建一个匿名类型并将其序列化为 json ,原因有两个:

  1. 它更具可读性和可维护性(有人更改代码需要多长时间,因为 json 结构已更改同时保持所有转义顺序 - 特别是在没有单元测试的情况下?)
  2. 它更可靠(如果taskName有双引号怎么办?)

下面使用 json.net 进行序列化。

var jsonObj = new {
  name = taskName,
  products = new[] {
    new { product = "ndvi_image", actions = new [] { new { mapbox = "processed" } },
    new { product = "true_color", actions = new [] { new { mapbox = "processed" } }
  },
  recurring = true,
  query = new {
    date_from = dateFromString,
    date_to = dateToString,
    aoi = polygon
  },
  aoi_coverage_percentage = 90
};

var jsonString = JsonConvert.SerializeObject(jsonObj);
Run Code Online (Sandbox Code Playgroud)

  • 恕我直言,这应该是公认的答案...即使在示例中,也不清楚“多边形”是什么,以及它是否真的安全或已经序列化。如果情况发生变化,另一边的一切都会爆炸怎么办? (3认同)
  • 这是一个更好的答案 (2认同)

小智 17

看来你错过了productsquery对象的逃脱:

$@"{{
    ""name"":""{taskName}"",
    ""products"": [
        {{""product"": ""ndvi_image"", ""actions"": [""mapbox"", ""processed""]}},
        {{""product"": ""true_color"", ""actions"": [""mapbox"", ""processed""]}}
    ],
    ""recurring"":true,
    ""query"": {{
        ""date_from"": ""{dateFromString}"",
        ""date_to"": ""{dateToString}"",
        ""aoi"": {polygon}
    }},
    ""aoi_coverage_percentage"":90
}}";
Run Code Online (Sandbox Code Playgroud)

  • 尽管从技术上讲是正确的,但这种方法不容易维护并且容易出错,因为如果其中一个变量包含双引号,则 json 可能会出现格式错误 (3认同)

das*_*ght 15

除了@"..."$"..."C#支持$@"..."字符串之外,在构建需要插值的多行字符串文字时,您正在寻找它:

$@"{{
    ""name"":""{taskName}"", 
    ""products"": [    
                {{""product"": ""ndvi_image"", ""actions"": [""mapbox"", ""processed""]}}, 
                {{""product"": ""true_color"", ""actions"": [""mapbox"", ""processed""]}}
              ], 
    ""recurring"":true,
    ""query"":   {{
                    ""date_from"": ""{dateFromString}"",
                    ""date_to"": ""{dateToString}"",
                    ""aoi"": {polygon}
                }},
    ""aoi_coverage_percentage"":90
}}";
Run Code Online (Sandbox Code Playgroud)