2011-04-05 67 views
3

我目前正在试图建立一个服务来检索和序列化Sitecore的数据项JSON,所以我们的JavaScript代码可以访问Sitecore的内容数据。序列化Sitecore.Data.Items.Item以JSON

我已经试过与序列化和JavascriptSerializer直接JSON.Net的对象;都由于递归而破灭,可能是由于各种关于儿童财产的循环引用。

我也试图序列化项目XML(通过item.GetOuterXml()),然后将XML转换成JSON。转换工作正常;但它只会检索在该项目上设置的字段,而不是在_standardvalues中设置的字段。我在序列化之前尝试调用item.Fields.ReadAll(),以及调用item.Fields.EnsureField(Field.id)的foreach循环;然而,既没有导致找回丢失的领域。但是,调试代码; Fields数组似乎包含了其基本模板中的所有继承字段以及该项目上设置的字段;所以我猜GetOuterXml只是忽略了没有专门设置的项目上的所有字段。

我越看越这个,它看起来越像我需要一个自定义模型类来封装数据项和必要的字段,用适当的JSON.Net序列化属性对它进行装饰,然后从那里。虽然这感觉像一个肮脏的黑客。

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

干杯, 弗兰克

+0

纯JSON缺乏间接/引用的概念,其基本上意味着它是_impossible_序列化任何仅包含JSON的循环引用。但是,您的JSON需要多少“纯度”?如果你只需要能够从JS反序列化,那么你可以超越JSON本身,并使用普通的对象引用。然而,除非有人已经完成了这项任务的肮脏工作,否则恐怕你必须至少实现一大块序列化逻辑。 – 2011-04-05 18:47:46

回答

4

我建议追求你创建一个自定义模型类来封装只是你需要传递到客户端的项目数据的方法。然后将该类序列化为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; } 
    } 
} 
+1

只是想要注意'CustomItem'模式可以使用[Velir的CIG](http://trac.sitecore.net/CustomItemGenerator)自动执行,您只需根据此答案编写额外的JSON属性 – 2011-04-06 05:13:18

0

我不知道如果使用XSLT递归构建JSON你会不会过得更好?