我目前正在尝试构建一项服务来检索 Sitecore 数据项并将其序列化为 JSON,以便我们的 Javascript 代码可以访问 Sitecore 内容数据。
我已经尝试使用 JavascriptSerializer 和 JSON.Net 直接序列化对象;两者都因递归而崩溃,这可能是由于对子属性的各种循环引用。
我还尝试将项目序列化为 XML(通过 item.GetOuterXml()),然后将 Xml 转换为 JSON。转换工作正常;但它只检索在项目本身上设置的字段,而不是在 _standardvalues 中设置的字段。我尝试在序列化之前调用 item.Fields.ReadAll(),以及调用 item.Fields.EnsureField(Field.id) 的 foreach 循环;但是,两者都没有导致检索丢失的字段。但是,调试代码; Fields 数组似乎包含从其基本模板继承的所有字段以及在项目上设置的字段;所以我猜 GetOuterXml 只是忽略了所有未专门针对该项目设置的字段。
我看得越多,就越觉得我需要一个自定义模型类来封装数据项和必要的字段,用适当的 JSON.Net 序列化属性对其进行装饰,然后从那里进行序列化.不过,这感觉像是一个肮脏的 hack。
所以在我走这条路之前;我想知道这里是否有人有过将 Sitecore 内容项目序列化为 JSON 以供客户端使用的经验,是否有我缺少的更简单的方法。非常感谢任何建设性的意见。
干杯, 弗兰克
最佳答案
我建议采用您创建自定义模型类的方法,以仅封装您需要传递给客户端的项目数据。然后将该类序列化为 JSON。这减少了您通过网络发送的数据量,并允许您选择要发送的数据(出于安全原因)。
CustomItem 模式和部分类非常适合这种方法。在下面的代码示例中,.base 类是您的基本自定义项包装器。您可以使用此类以强类型方式访问字段和字段值。 .instance 类可用于 JSON 序列化。
通过分离出您想要序列化的属性,您可以精细地控制发送回请求客户端的数据,并且您不必担心循环引用。如果您需要对字段定义进行任何更改,您可以简单地更改您的 .base 类,而对 JSON 序列化的影响最小。
希望这对您有所帮助!
MyCustomItem.base.cs
public partial class MyCustomItem : Sitecore.Data.Items.CustomItem
{
public const string TitleFieldName = "Title";
public MyCustomItem(Item innerItem) : base(innerItem)
{
}
public static implicit operator MyCustomItem(Item innerItem)
{
return innerItem != null ? new MyCustomItem(innerItem) : null;
}
public static implicit operator Item(MyCustomItem customItem)
{
return customItem != null ? customItem.InnerItem : null;
}
public string Title
{
get { return InnerItem[TitleFieldName]); }
}
}
MyCustomItem.instance.cs
[JsonObject(MemberSerialization.OptIn)]
public partial class MyCustomItem
{
[JsonProperty("Title")]
public string JsonTitle
{
get { return Title; }
}
}
关于c# - 将 Sitecore.Data.Items.Item 序列化为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5556739/