反序列化 CRM Web 资源中存储为 JSON 的设置

Deserializing Settings Stored As JSON In CRM Web Resource

我在 CRM 的网络资源中添加了一些配置数据 JSON。当我尝试在 C# 插件中反序列化它时,我必须首先解码 Base 64 字符串,然后我必须对 UTF 字节进行编码。我之前在 CRM 之外做过这件事并且没有遇到问题,但是当我的 JSON 由于参数异常 "Invalid JSON primitive: ."

没有反序列化时,CRM 让我陷入了循环

我终于发现 CRM 包含 UTF 序言,但那是无效的 JSON 所以我必须将其删除。下面是我当前的解决方案,但我认为有一种标准方法来编码(或解码)字节,检查前导码是什么,并正确应用正确的编码和 return 结果没有序言。

private static Settings Deserialize(WebResource value) {
    if (value == null)
    {
        throw new ArgumentNullException("value");
    }

    // By Default, Content is stored in a Base64String with a UTF preamble.
    var content = Encoding.UTF8.GetString(Convert.FromBase64String(value.Content)); 
    var preamble = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());

    if (content.StartsWith(preamble))
    {
        content = content.Remove(0, preamble.Length);
    }

    return new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<Settings>(content); 
}

肯定有更标准的方法来做到这一点?

我深入研究了编码 Class 结构并注意到它需要一个布尔值 encoderShouldEmitUTF8Identifier 来确定是否应该发出前导码。不幸的是,这实际上做的唯一一件事是如果设置为 false,GetPreamble() 将 return 为空值。这意味着您必须手动检查并删除前导码(如果存在)。