我在 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);
}
当然有更标准的方法来做到这一点?