Сериализация Sitecore.Data.Items.Item для JSON - PullRequest
3 голосов
/ 05 апреля 2011

В настоящее время я пытаюсь создать службу для извлечения и сериализации элемента данных Sitecore в JSON, чтобы наш код Javascript мог получить доступ к данным содержимого Sitecore.

Я попытался сериализовать объект напрямую с помощью JavascriptSerializer иJSON.Net;оба прервались из-за рекурсии, вероятно, из-за различных циклических ссылок на дочерние свойства.

Я также пытался сериализовать элемент в XML (через item.GetOuterXml ()), а затем преобразовал Xml в JSON.Преобразование работало нормально;но он извлекает только те поля, которые были установлены для самого элемента, а не поля, которые были установлены в _standardvalues.Я попытался вызвать item.Fields.ReadAll () перед сериализацией, а также цикл foreach с вызовами item.Fields.EnsureField (Field.id);однако ни один из них не привел к поиску пропущенных полей.Тем не менее, отладка кода;кажется, что массив Fields содержит все унаследованные поля из своего базового шаблона, а также поля, установленные для элемента;поэтому я предполагаю, что GetOuterXml просто игнорирует все поля, которые не были заданы специально для элемента.

Чем больше я смотрю на это, тем больше похоже, что мне понадобится собственный класс модели дляинкапсулируйте элемент данных и необходимые поля, украсьте его соответствующими атрибутами сериализации JSON.Net и сериализуйте оттуда.Это похоже на грязный хак.

Итак, прежде чем я пойду по этой дороге;Я хотел бы знать, имел ли кто-нибудь здесь опыт сериализации элементов контента Sitecore в JSON для использования на стороне клиента, и есть ли более простой способ, который я пропускаю.Любой конструктивный вклад приветствуется.

Ура, Фрэнк

Ответы [ 2 ]

4 голосов
/ 06 апреля 2011

Я бы предложил использовать ваш подход к созданию пользовательского класса модели для инкапсуляции только тех данных элемента, которые необходимо передать клиенту.Затем сериализуйте этот класс в 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; }
    }
}
0 голосов
/ 05 апреля 2011

Интересно, не лучше ли использовать XSLT для рекурсивной сборки JSON?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...