反序列化 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 为空值。这意味着您必须手动检查并删除前导码(如果存在)。
我在 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 为空值。这意味着您必须手动检查并删除前导码(如果存在)。