You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 13:38:11