如何在C#中将Dynamics CRM接收的字符串转换为Dictionary
解决Dynamics CRM CodeActivity中JSON字符串转Dictionary并获取ID值的问题
嘿,作为同是Dynamics CRM开发者,我太懂这种处理JSON字段的头疼了!你的思路方向对,但手动截取JSON的方式容易踩坑(比如JSON里有空格、转义字符或者格式变化时就会出错),给你分享更靠谱的解决方案:
核心思路:用专业JSON库解析,而非手动处理字符串
CRM返回的这个格式是标准的JSON数组,直接用JSON序列化库(Dynamics CRM插件/CodeActivity常用Newtonsoft.Json,新版本也支持System.Text.Json)就能轻松转换成Dictionary,还能兼容任意数量的键值对。
完整代码示例(用Newtonsoft.Json)
首先确保你的项目已经引用了Newtonsoft.Json(Dynamics CRM的插件模板通常默认包含),然后按以下步骤处理:
using Newtonsoft.Json; using System.Collections.Generic; using System; // 你的CodeActivity执行方法内的代码 public void Execute(CodeActivityContext context) { // 1. 从CRM字段获取值(这里模拟实际场景,替换成你的字段读取逻辑) string crmFieldValue = "[{\"name\":\"Sherlock\",\"id\":\"a10ef25\",\"date\":\"2024-05-20\"}]"; // 2. 先处理空值,避免反序列化异常 if (string.IsNullOrEmpty(crmFieldValue)) { // 字段为空的逻辑,比如返回或记录日志 return; } try { // 3. 反序列化为Dictionary的列表(因为外层是数组) List<Dictionary<string, string>> jsonItems = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(crmFieldValue); // 4. 检查数组是否有元素,然后获取第一个Dictionary if (jsonItems != null && jsonItems.Count > 0) { Dictionary<string, string> itemDict = jsonItems[0]; // 5. 安全获取"id"对应的值(先判断键是否存在) if (itemDict.TryGetValue("id", out string idValue)) { // 这里可以用idValue做后续操作,比如赋值给其他字段、调用API等 // 示例:Console.WriteLine($"获取到的ID值:{idValue}"); } else { // 处理没有"id"键的情况,比如记录警告日志 } } } catch (JsonException ex) { // 处理JSON格式错误的异常,比如记录错误日志 throw new InvalidPluginExecutionException("解析CRM字段JSON失败:" + ex.Message); } }
如果用System.Text.Json(适用于新版本Dynamics 365)
如果你的环境用的是System.Text.Json(比如.NET Core/.NET 5+的插件),代码类似:
using System.Text.Json; using System.Collections.Generic; using System; public void Execute(CodeActivityContext context) { string crmFieldValue = "[{\"name\":\"Sherlock\",\"id\":\"a10ef25\",\"date\":\"2024-05-20\"}]"; if (string.IsNullOrEmpty(crmFieldValue)) { return; } try { List<Dictionary<string, string>> jsonItems = JsonSerializer.Deserialize<List<Dictionary<string, string>>>(crmFieldValue); if (jsonItems != null && jsonItems.Count > 0) { if (jsonItems[0].TryGetValue("id", out string idValue)) { // 使用idValue } } } catch (JsonException ex) { throw new InvalidPluginExecutionException("解析CRM字段JSON失败:" + ex.Message); } }
为什么不推荐手动截取字符串?
你之前尝试的value.Substring(1.value.Length-1)不仅有语法错误(正确应该是value.Substring(1, value.Length - 2)),而且存在以下问题:
- 如果JSON数组里有空格(比如
[ {"name":"Sherlock", "id":"a10ef25"} ]),截取后剩下的字符串会带空格,后续转Dictionary会失败 - 如果JSON有转义字符或者嵌套结构,手动处理完全无法胜任
- 代码可读性和维护性差,后续加字段还要修改截取逻辑
用专业JSON库能完美规避这些问题,不管有多少键值对都能正确解析。
内容的提问来源于stack exchange,提问作者Krushna Kumar
相关产品推荐
相关产品推荐

