Newtonsoft JsonConvert.DeserializeObject 动态解析json
十年河东,十年河西,莫欺少年穷
学无止境,精益求精
最近在优化项目代码,发现结构基本相同的json在反序列化时需要定义多个类,这大大减少了开发效率
原来的代码这样写的
/// <summary> /// 仓位状态 心跳包 /// </summary> public string deviceVersionReportResponse(string message) { try { var model = new WA_RequestBase<List<WA_CangweiZtResult>>(); model = Newtonsoft.Json.JsonConvert.DeserializeObject<WA_RequestBase<List<WA_CangweiZtResult>>>(message); WA_Base<WA_CangweiZtResponse> result = new WA_Base<WA_CangweiZtResponse>(); result.cmd = model.cmd; result.id = model.id; result.rst = 0; if (model.dat != null && model.dat.Count > 0) { WA_CangweiZtResponse dat = new WA_CangweiZtResponse() { tm = CommonMethod.Get13TimeSpan(), dr = 0 }; result.dat = dat; return Newtonsoft.Json.JsonConvert.SerializeObject(result); } return ""; } catch (Exception ex) { throw ExceptionHelper.GetAggregateException("WA_DeviceResponseService", "deviceVersionReportResponse", message, ex); } }
修改后如下:
实例1、
json 如下:
{ "id": "1111102101280049", "cmd": "allst", "dat": [{ "dr": 1, "ds": 0, "usw": 0, "dt": 68, "btinfo": "" }, { "dr": 2, "ds": 0, "usw": 1, "dt": 68, "btinfo": "NTQ3MzEyMTEwMDEwMDI3NwJYAKACeAAATmMCAAAAAAEDAQANvgzgRUUTDQwNCg0MDQoNCg0QDQsNvg0LDQsM4QzhDOEM4QzhDOEM4QzhDOECRUVHRwACAFUAJwAAACcAAAAAAAAAAAAAAA==" }, { "dr": 3, "ds": 0, "usw": 1, "dt": 67, "btinfo": "MjIyMzEyMTA0MDEwMDIzNQHgAKAB/wAATmMCHgUjGgEAAQENog0KRUUPDVwNHw0eDVgNTg0KDSYNPA2fDQoNoA2gDaINIQ2gAkVFSEgAAgCbAFEAAwBOAAAAAAAAAAAAAAA=" }, { "dr": 4, "ds": 0, "usw": 1, "dt": 67, "btinfo": "MjIyMzEyMTA0MDEwMDUzOAHgAKACBAAATmMCK98xdgEAAQENog0MRUUPDaENog2hDaINoA0MDZ8NoQ1YDQwNcQ1gDU4NjA1dAkVFR0cAAgJwAHcAAwB0AAAAAAAAAAAAAAA=" }] }
代码:
/// <summary> /// 回复设备消息 /// </summary> /// <param name="method"></param> /// <param name="message"></param> /// <returns></returns> public static string getMessage(string method, string message) { var result = string.Empty; var dict = JsonConvert.DeserializeObject<Dictionary<object, object>>(message); var cmd = dict["cmd"]; var id = dict["id"]; var rst = 0; if (dict.ContainsKey("rst")) { rst = Convert.ToInt32(dict["rst"]); } switch (method) { case "allst":var obj = new { cmd =cmd,id=id,rst=rst, dat =new { tm = CommonMethod.Get13TimeSpan(), dr = 0 } }; result = Newtonsoft.Json.JsonConvert.SerializeObject(obj); break; } return result; }
由于json中不存在rst,因此:需要做key是否存在的判断,否则异常。
实例2/
static void Main(string[] args) { var json = @"{ 'DisplayName': '新一代算法模型', 'CustomerType': 1, 'Report': { 'TotalCustomerCount': 1000, 'TotalTradeCount': 50 }, 'CustomerIDHash': [1,2,3,4,5] }"; var dict = JsonConvert.DeserializeObject<Dictionary<object, object>>(json); var report = dict["Report"] as JObject; var totalCustomerCount = report["TotalCustomerCount"]; Console.WriteLine($"totalCustomerCount={totalCustomerCount}"); var arr = dict["CustomerIDHash"] as JArray; var list = arr.Select(m => m.Value<int>()).ToList(); Console.WriteLine($"list={string.Join(",", list)}");
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
2020-06-28 实时web应用方案——SignalR(.net core) 理论篇
2019-06-28 webuploader-异步切片上传(暂不支持断点续传)及 下载方法!C#/.NET