【问题标题】:Serializing a Sitecore.Data.Items.Item to JSON将 Sitecore.Data.Items.Item 序列化为 JSON
【发布时间】:2012-02-08 00:06:32
【问题描述】:

我目前正在尝试构建一个服务来检索 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 序列化属性装饰它,然后从那里序列化.不过,这感觉像是一种肮脏的黑客行为。

所以在我走这条路之前;我想知道这里是否有人有将 Sitecore 内容项序列化为 JSON 以供客户端使用的经验,是否有一种更简单的方法我错过了。非常感谢任何建设性的意见。

干杯, 弗兰克

【问题讨论】:

  • 纯 JSON 缺少间接/引用的概念,这实质上意味着不可能仅使用 JSON 序列化包含循环引用的任何内容。但是,您的 JSON 需要多少“纯度”?如果您只需要能够从 JS 反序列化,那么您可以超越 JSON 本身并使用普通对象引用。但是,除非有人已经为这项任务完成了繁琐的工作,否则恐怕您至少必须实现大量的序列化逻辑。

标签: c# json sitecore sitecore6


【解决方案1】:

我建议您采用创建自定义模型类的方法来封装您需要传递给客户端的项目数据。然后将该类序列化为 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; }
    }
}

【讨论】:

  • 只是想注意CustomItem 模式可以使用Velir's CIG 自动化,您只需要根据这个答案编写额外的 JSON 属性
【解决方案2】:

我想知道使用 XSLT 递归构建 JSON 会不会更好?

【讨论】:

    猜你喜欢
    • 2012-02-25
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 2021-12-31
    相关资源
    最近更新 更多