1

我在 CRM 的 Web 资源中添加了一些配置数据作为 JSON。当我尝试在 C# 插件中对其进行反序列化时,我必须首先解码 Base 64 字符串,然后必须对 UTF 字节进行编码。我之前在 CRM 之外做过这个并且没有遇到问题,但是当我的 JSON 由于参数异常“无效 JSON 原语:”而没有反序列化时,CRM 让我陷入了循环。

我终于发现 CRM 包含 UTF Preamble 并且这不是有效的 JSON,所以我必须删除它。以下是我当前的解决方案,但我原以为有一种标准方法来编码(或解码)字节,以检查前导码是什么,并正确应用正确的编码并返回没有前导码的结果。

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); 
}

当然有更标准的方法来做到这一点?

4

1 回答 1

0

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

于 2015-05-01T15:09:23.337 回答