编程语言
首页 > 编程语言> > c#-将Sitecore.Data.Items.Item序列化为JSON

c#-将Sitecore.Data.Items.Item序列化为JSON

作者:互联网

我目前正在尝试构建服务来检索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; }
    }
}

标签:sitecore,sitecore6,json,c
来源: https://codeday.me/bug/20191102/1993847.html