二开WebApi返回DataSet对象,当其中的DataTable的Rows为空时,2023-11补丁后返回空DataTable的json数据不一样。
【问题描述】
二开WebApi接口,并返回DataSet对象,当其中的DataTable的Rows为空时,2023-11补丁后返回的json数据不一样了。
例如:select fname from t_xxx_table where fname='test' , 数据库中不存在test数据时返回一个包含空数据的DataTalbe的DataSet时。历史版本返回了:{"Table": [] },2023-11版本后返回了: {"Table":[{"fname":"","ColumnTypeFullName":"System.String","TableRowsIsEmpty":true}]},携带了结构和数据空标识。
【场景介绍】
业务场景及原因分析:升级2023-11补丁版本后,增强了数据安全与准确性
问题出现版本:PT-151005 [8.2.0.20231109] 发布时间:2023/11/9 构建号:8.2.775.7
问题出现端:WebApi
原因分析:
当查询select fname from t_xxx_table where fname='test' 时。
老版本直接返回空包{"Table":[]},把查询结构直接丢失了,显然是不正确的,导致整个查询结构丢失了。
新版本修复了该问题,当查询的DataTable中数据为空时,标注该DataTable中的TableRowsIsEmpty数据为空,同时会返回查询的数据结构,并在每个字段后面紧跟ColumnTypeFullName属性描述前面的字段数据类型,用于JsonConver时准确恢复字段类型,确保接收端反序列化时与服务端DataTable的数据结构一致。
当查询数据为空时:{"Table":[{"fname":"","ColumnTypeFullName":"System.String","TableRowsIsEmpty":true}]} 。
当查询数据不为空时:{"Table":[{"fname":"demo","ColumnTypeFullName":"System.String"}]}。
【解决方案】
出现这样的提示是由于在查询不到数据时返回的DataTable保持了查询结构,而不是完全的空对象,而二开代码判断空对象而不是数据导致,导致不能正确判断,请尝试下列操作来解决:
方案一, 判断Json数据内容
建议二开程序接受端改进下DataTable为空时的判断逻辑,可判断返回的Table对象中的属性 TableRowsIsEmpty = true。
方案二, 返回数据反序列化为DataSet对象
反序列化返回的json数据为DataSet对象,然后操作DataSet的Tables做判断即可。
var ser = new Kingdee.BOS.ServiceFacade.JsonSerializerProxy(Encoding.UTF8, false); DataSet ds = (DataSet)ser.Deserialize(jsonstr, typeof(DataSet));
方案三,建议构建二开实体类返回,不直接返回DataSet(推荐)
不建议直接返回DataSet或DataTable,建议二开构建实体类对象返回数据,这样可以确保数据简洁安全和一致性。同时在接收端的判断代码中获得更好的保护性。
【延伸阅读】
(此处书写相关知识,若无可直接删掉,若插入链接,请选择菜单栏的链接进行插入)
【二开案例.WebApi.从零开发自定义WebApi接口】https://vip.kingdee.com/article/97030089581136896?productLineId=1&isKnowledge=2
二开WebApi返回DataSet对象,当其中的DataTable的Rows为空时,2023-11补丁后返回空DataTable的json数据不一样。
本文2024-09-23 03:47:09发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-161090.html