首页 > 解决方案 > 如何序列化松弛块?在 C# 中

问题描述

我使用 Slack block kit builder 制作了一个模板

我读取了一些数据并填写了八个参数

在我的 C# 代码中,我必须使用内插字符串和花括号来提供参数 {}。我还需要通过添加两次来跳过大括号。

但是当我进行发布消息调用时,这不会被识别为正确的 json:

var data = new NameValueCollection();
data["token"] = token;
data["channel"] = channelName;
data["as_user"] = "true";           
data["text"] = postedMessage;
data["blocks"]=jsonstring; 
var client = new WebClient();
var response = client.UploadValues("https://slack.co/api/chat.postMessage", "POST", data);
string responseInString = Encoding.UTF8.GetString(response);
Console.WriteLine(responseInString);

我理解正确的方法是将这些块表示为 classes 。我试图遵循松弛附件表示,但块更复杂,包含内部对象而不是字符串变量作为附件类。感谢您支持使用简单的语法和正确的 json 来表示块

标签: c#jsonslack

解决方案


您的代码不起作用的原因是在 C# 中单引号仅适用于单个字符。以下是如何为硬编码字符串常量正确转义 JSON 的双引号和大括号。

普通字符串常量

要正确转义代码中的硬编码 JSON,您需要在 JSON 字符串的每个双引号中添加一个反斜杠。

示例

string someJson = "{\"ErrorMessage\": \"\",\"ErrorDetails\": {\"ErrorID\": 111,\"Description\":{\"Short\": 0,\"Verbose\": 20},\"ErrorDate\": \"\"}}";

还有其他方法可以做到这一点。有关解决方案的完整概述,请参阅此问题。

顺便提一句。在这种方法中,您不需要转义大括号。

内插字符串常量

使用插值字符串,您还需要转义双引号。但在这里它通过将它们加倍来工作。

示例

string someJson = "{\"ErrorMessage\": \"\",\"ErrorDetails\": {\"ErrorID\": 111,\"Description\":{\"Short\": 0,\"Verbose\": 20},\"ErrorDate\": \"\"}}";

对于插值字符串,您还需要转义大括号。这是通过将转义的大括号加倍来实现的,因为单个大括号用于插值。

示例

var json = $@"{{""name"":""{name}""}}";

另请参阅此答案以获取有关如何转义大括号的完整讨论。


推荐阅读