c# - 如何序列化松弛块?在 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# 中单引号仅适用于单个字符。以下是如何为硬编码字符串常量正确转义 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}""}}";
另请参阅此答案以获取有关如何转义大括号的完整讨论。
推荐阅读
- python - 使用python解析xml获取x,y值
- python - 保存 Django ModelForms
- android - 如何将 config.xml 中的权限声明为 AndroidManifest.xml?
- ios - 提供的视图控制器数量 (0) 与请求的转换所需的数量 (1) 不匹配
- bash - 在 macOS 中使用格式化的日期时间列出文件(相当于在 linux 中查找 -printf)
- angular - Angular CLI 9 - 无法复制资产:EFAULT:系统调用参数中的错误地址,copyfile
- azure - OAuth 2.0 配置与 Azure API 管理中的入站策略设置有何不同?
- python - Python regex ignoring pattern
- common-lisp - MIT Scheme中macroexpand-1和macroexpand怎么做?
- html - Angular - 如何将计数器变量从模板添加到 html 属性?