2011-04-05 46 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你會不會過得更好?