.Net Framework 4.8 Post接口接收多格式JSON的可行方案咨询
解决方案:在.NET Framework 4.8中处理动态结构的JSON请求
针对你需要在同一个Post方法接收动态items结构的需求,完全可以通过将items定义为字符串(或更便捷的JToken),再根据process字段反序列化为对应实体类的方式实现,以下是具体实现方案:
方案1:将items定义为字符串类型
步骤1:修改DataPost模型
将items字段改为string类型,用于接收序列化后的JSON字符串:
public class DataPost { public string client { get; set; } public string process { get; set; } public string environment { get; set; } public string items { get; set; } }
步骤2:定义对应items结构的实体类
根据不同process对应的items结构,创建专属实体类:
// 对应示例1的items结构 public class TargetItems { public string target { get; set; } public string content { get; set; } } // 对应示例2的items结构 public class VersionItems { public string alpha { get; set; } public string beta { get; set; } public string version { get; set; } }
步骤3:在Post方法中处理反序列化
根据process字段的值,将items字符串反序列化为对应实体类并处理:
[HttpPost] [Route("")] public HttpResponseMessage Post([FromBody] DataPost dataPost) { if (string.IsNullOrEmpty(dataPost.process)) { return Request.CreateResponse(HttpStatusCode.BadRequest, "process字段不能为空"); } switch (dataPost.process) { case "ApiProcessTarget": // 匹配示例1的process标识 var targetItems = JsonConvert.DeserializeObject<TargetItems>(dataPost.items); // 编写针对TargetItems的业务逻辑 break; case "ApiProcessVersion": // 匹配示例2的process标识 var versionItems = JsonConvert.DeserializeObject<VersionItems>(dataPost.items); // 编写针对VersionItems的业务逻辑 break; default: return Request.CreateResponse(HttpStatusCode.BadRequest, "不支持的process类型"); } return Request.CreateResponse(HttpStatusCode.OK); }
注意:此方案需要前端将
items对象序列化为字符串后再传递,若无法修改前端逻辑,更推荐下面的方案2。
方案2:用JToken接收动态items(推荐)
利用Newtonsoft.Json的JToken类型直接接收任意JSON结构,无需前端修改请求格式:
步骤1:修改DataPost模型
引入Newtonsoft.Json.Linq命名空间,将items字段改为JToken类型:
using Newtonsoft.Json.Linq; public class DataPost { public string client { get; set; } public string process { get; set; } public string environment { get; set; } public JToken items { get; set; } }
步骤2:在Post方法中转换为对应实体类
通过JToken.ToObject<T>()方法直接将动态结构转换为目标实体类:
[HttpPost] [Route("")] public HttpResponseMessage Post([FromBody] DataPost dataPost) { if (string.IsNullOrEmpty(dataPost.process)) { return Request.CreateResponse(HttpStatusCode.BadRequest, "process字段不能为空"); } switch (dataPost.process) { case "ApiProcessTarget": var targetItems = dataPost.items.ToObject<TargetItems>(); // 处理TargetItems业务逻辑 break; case "ApiProcessVersion": var versionItems = dataPost.items.ToObject<VersionItems>(); // 处理VersionItems业务逻辑 break; default: return Request.CreateResponse(HttpStatusCode.BadRequest, "无效的process标识"); } return Request.CreateResponse(HttpStatusCode.OK); }
此方案无需前端调整请求格式,直接兼容原有的JSON结构,同时保留强类型处理的安全性和便捷性。
内容的提问来源于stack exchange,提问作者Renato Bertizini
相关产品推荐
相关产品推荐

