Teams Bot 如何使用新的 System.Text.Json 库

我最近把 LuckyDraw的代码升级到了 .net core 3.1,当然我也很想使用最新的微软json库,System.Text.Json这个库的性能比之前Newtonsoft.Json速度更快,而且就我本人爱好来说,更加喜欢System.Text.Json的命名,之前一直觉得 JObject, JArray, JToken 这些名字不够符合 c# 的 naming guideline。

微软 这篇文章 很好的告诉大家如何将 Newtonsoft.Json 迁移到 System.Text.Json,但是如果你是用Bot SDK来开发teams bot,事情比你想象的复杂很多。

我们先来看一下bot sdk的sample code是怎么做的,打开EchoBot的代码,找到Startup.cs文件,你可以看到这么一行:

public class Startup
{...public void ConfigureServices(IServiceCollection services){services.AddControllers().AddNewtonsoftJson();...}
}

现在大家明白了把,bot samples虽然都已经升级到了.net core 3.1,但是,它还是把mvc设置成使用Newtonsoft.Json。

那问题到底在哪里,为什么一定要使用Newtonsoft? 我们来看一下bot sdk源码,看一下bot framework里最核心的Activity的代码。

public partial class Activity
{...[JsonProperty(PropertyName = "type")]public string Type { get; set; }[JsonProperty(PropertyName = "id")]public string Id { get; set; }[JsonProperty(PropertyName = "timestamp")]public System.DateTimeOffset? Timestamp { get; set; }[JsonProperty(PropertyName = "localTimestamp")]public System.DateTimeOffset? LocalTimestamp { get; set; }[JsonProperty(PropertyName = "localTimezone")]public string LocalTimezone { get; set; }[JsonProperty(PropertyName = "serviceUrl")]public string ServiceUrl { get; set; }[JsonProperty(PropertyName = "channelId")]public string ChannelId { get; set; }[JsonProperty(PropertyName = "from")]public ChannelAccount From { get; set; }...
}

可以看到每个property都有一个JsonProperty的attribute,这个attribute是在Newtonsoft.Json里定义的,当序列化的时候,会使用指定的name作为json里的属性名字。当然在新的System.Text.Json里也有一个对应的attribute,叫JsonPropertyName,所以问题就来了,如果我们使用新的System.Text.Json来对一个activity对象进行serialize和deserialize,由于属性 Type 上只有JsonProperty并没有新的JsonPropertyName,serialize后,json就用了首字母大写的{"Type":"blablabla"},如果是使用老的Newtonsoft.Json,那就是{"type":"blablabla"}

当然不单单是JsonProperty这么一个问题,还有其他json序列化和反序列化的一些attribute也有类似问题,比如下面这两个:

namespace Microsoft.Bot.Builder.Dialogs.Adaptive.Templates
{[JsonConverter(typeof(ActivityTemplateConverter))]public class ActivityTemplate : ITemplate<Activity>{...}
}
namespace Microsoft.Bot.Builder.Dialogs.Adaptive.Actions
{public class BeginDialog : BaseInvokeDialog{[JsonConstructor]public BeginDialog(...): base(dialogIdToCall, options){...}...}
}

正式由于上面这些问题,所以如果要继续拥护在mvc里使用新的System.Text.Json,同时又要使用bot sdk来做开发,那就必须在和bot sdk里一些对象打交道的时候使用老的Newtonsoft.Json。

比如以前可以这么写:

public class MessagesController : ControllerBase
{[HttpPost("messages")]public async Task<IActionResult> GetMessage([FromBody]Activity activity){...}
}

现在就要:

public class MessagesController : ControllerBase
{[HttpPost("messages")]public async Task<IActionResult> GetMessage(){Activity activity;using (var streamReader = new StreamReader(Request.Body)){var bodyString = await streamReader.ReadToEndAsync();activity = JsonConvert.DeserializeObject<Activity>(bodyString);}...}
}

因为你不能再依赖于mvc来帮你deserialize出Activity对象,因为我们的mvc是使用新的System.Text.Json。

当我们要返回一个activity对象的时候,以前可以这样:

[HttpPost("messages")]
public async Task<IActionResult> GetMessage([FromBody]Activity activity)
{Activity repliedActivity;...return Ok(repliedActivity);
}

现在就要:

[HttpPost("messages")]
public async Task<IActionResult> GetMessage()
{Activity repliedActivity;...return OkFromNewtonsoftJson(repliedActivity);
}private IActionResult OkFromNewtonsoftJson(object value)
{if (value == null){return NoContent();}var json = JsonConvert.SerializeObject(value);return Content(json, "application/json", Encoding.UTF8);
}

因为我们不能再靠mvc来帮你serialize一个Activity对象,必须手动使用Newtonsoft.Json来序列化。

希望bot sdk和其他sdk,能够尽快的兼容新的Json库,这样才能使广大开发者拥抱 System.Text.Json。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将Teams Template升级到dotnet core 3.1

为了方便开发者开发Teams应用&#xff0c;我在2018年做了dotnet c#的一套模板&#xff0c;这套模块一共有三种类型&#xff0c;一个是Teams OutgoingWebhook&#xff0c;一个是MessagingExtension&#xff0c;还有一个就是Tab。 今天特地去nuget上看了一下&#xff0c;下载量还…

【动态规划】cf1034C. Region Separation

质因数分解套路的复杂度分析的动态规划 题目大意 有一颗$n$个节点有点权的树&#xff0c;初始整棵树为$1$号区域&#xff0c;要求满足下列规则&#xff1a; 除非$i$是最后一个等级&#xff0c;否则每一个$i$级区域都要被分成至少两个$i1$级区域对于每种等级&#xff0c;每个点必…

阿里大鱼短信介入demo分享

下面是关于大鱼短信平台对接的例子&#xff0c;发短信的话&#xff0c;可以用这个&#xff0c;很好用 /*** 通过阿里短信接口发送短信验证码* ***/ public class SendSmsUtil {private static Logger logger Logger.getLogger(SendSmsUtil.class);/*** 生成验证码* return*/pu…

GraphAPI 1.0中新增加的Teams API

这篇继续介绍BUILD大会里的内容&#xff1a;两个新加入GraphAPI 1.0的关于Teams的API。 这两个新增api是关于在频道Channel里发送消息和回复消息的。实际上这两个api在beta版本中早就已经加入&#xff0c;上个月build大会中公布的只是把这两个api正式发布到1.0版本&#xff0c…

【数据结构】线性表(一):顺序列表

线性表(linear_list)是最常用且最简单的一种数据结构&#xff0c;简言之&#xff0c;一个线性表是n个数据元素的有序序列。 例如&#xff1a;&#xff08;a1 , ... , ai-1 , ai , ai1 , ... , an)&#xff1a;ai-1 是 ai 的直接前驱&#xff0c;ai1 是 ai 的直接后驱。 并且&am…

Python_XlrdXlwt

1 import xlrd 2 # \U 开始的字符被编译器认为是八进制 解决方法 r 3 objWB xlrd.open_workbook(rC:\Users\IBM\Desktop\S1\7月下旬入库表.xlsx) 4 # 索引号 objTable objWB.sheet_by_index(0) 5 objTable objWB.sheet_by_name(7月下旬入库表) 6 # 单元格3种读取方式 7 print…

校招需要看的书 巩固的知识

前言 感谢教练&#xff0c;学长们&#xff0c;队友&#xff0c;lollipop&#xff0c;猫哥&#xff0c;李哥&#xff0c;表哥&#xff0c;鸡哥&#xff0c;样样&#xff0c;咸糖&#xff0c;茗记&#xff0c;明沙&#xff0c;嘻&#xff0c;树佬(排名不分先后)等等太多太多的人的…

新的Teams API权限控制

这篇继续介绍BUILD大会里的内容&#xff1a;新的Teams API权限。这些新的权限让开发者可以更加细粒度的设置权限。 之前有些开发人员有问过我&#xff0c;为什么Graph API的权限这么多&#xff0c;为什么不针对Teams弄一个总的权限&#xff0c;这样不是更加简单吗&#xff1f;…

物料主数据(MM03)跳转函数

CP_08_MATERIAL_SHOW 使用感觉能使自己的代码显得更改高端些。 其中参数MTSTA_IMP的选值参照表T132。转载于:https://www.cnblogs.com/tangcy1110/p/9081380.html

二叉树的蛇形遍历 leetcode 103

给定一个二叉树&#xff0c;返回其节点值的锯齿形层次遍历。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 例如&#xff1a;给定二叉树 [3,9,20,null,null,15,7], 3/ \9 20/ \15 7返回…

Teams Tab的Single Sign-On

在我写这篇文章的时候&#xff0c;这个SSO机制还是在 Developer Preview 阶段&#xff0c;可能在发布前还会有一些改进。不过我觉得这个功能很好&#xff0c;所以先和大家分享一下。 如果大家之前已经开发过Teams的tab应用&#xff0c;可能会发现如果你需要一个当前用户的toke…

vim编辑器的使用--转自MJ学长

一、引言 1. vim是一款功能强大的文本编辑器&#xff0c;如果使用熟练&#xff0c;将会有效帮助我们提高编辑文本、程序的效率。vim编辑器的上手使用门槛比较高&#xff0c;很多人怯于要记很多命令&#xff0c;往往在学习的初期阶段就望而却步。 2. vim的学习需要不断的练习、使…

算法引入

算法的概念&#xff1a; 解决问题的思路。 时间复杂度&#xff1a; 定义&#xff1a; 基本运算的执行数量。是算法效率的衡量的量。 计算准则&#xff1a; 基本操作&#xff1a;即只有常数项。复杂度认为1顺序&#xff0c;按照加法计算循环&#xff0c;按照乘法计算条件。按照最…

如何开发Teams Bot

很多朋友问我如何开发一个成功的Teams Bot&#xff0c;他们说Bot Framework SDK看起来简单&#xff0c;但是真要的去开发一款成熟的bot&#xff0c;很多地方还是不知道如何使用。我从最早的bot framework还在beta的时候开始用&#xff0c;后来framework经历了多次大的改动&…

[CF903G]Yet Another Maxflow Problem

[CF903G]Yet Another Maxflow Problem 题目大意&#xff1a; 有\(A\)类点和\(B\)类点各\(n(n\le2\times10^5)\)个&#xff0c;所有\(A_i\)到\(A_{i1}\)有一条权值为\(a_i\)的有向边&#xff0c;所有\(B_i\)到\(B_{i1}\)有一条权值为\(b_i\)的有向边&#xff0c;另有\(m(m\le2\t…

P1579哥德巴赫猜想

写来自己学习用~ 题目内容&#xff1a; 1742年6月7日哥德巴赫写信给当时的大数学家欧拉&#xff0c;正式提出了以下的猜想&#xff1a;任何一个大于9的奇数都可以表示成3个质数之和。质数是指除了1和本身之外没有其他约数的数&#xff0c;如2和11都是质数&#xff0c;而6不是质…

在VSCode Remote环境下开发Teams Bot

我使用VS Code开发已经有蛮长一段时间了&#xff0c;时间长了&#xff0c;越来越喜欢VS Code&#xff0c;虽然有些时候会没有传统的VS方便&#xff0c;比如开发Azure Function时你需要编写一下launch.json&#xff0c;而且你需要手动启动StorageEmulator&#xff0c;但是也正是…

查看安卓APK源码破解

原文:查看安卓APK源码破解工具准备&#xff1a; <1>.android4me的AXMLPrinter2工具 <2>dex2jar <3>jd-gui 工具下载&#xff1a;http://download.csdn.net/detail/catshitone/8491347 开始&#xff1a; 第一步&#xff1a; 首先用解压软件&#xff08;如好…

实验六:类的封装

一、实验代码如下&#xff1a; 1 package 实验6;2 3 import java.util.Scanner;4 5 6 public class Account {7 8 public int id;9 public String name;10 public long number;11 public long time;12 public int money;13 14 //方法Account()…

Teams Bot开发系列:初识Bot

上次我们讲了Teams Bot开发的概述&#xff0c;讲了Azure Bot Service&#xff0c;Bot Framework SDK和我们自己的bot服务的概念&#xff0c;这篇文章就带大家看看Azure Bot Service和我们的bot是如何发生关系的。 我们自己开发的bot服务实际上就是一个api service&#xff0c;…