Published on:Feb 15, 2022
Views: 429
Number of votes: 6
Average rating:

Property Lists Serialization and Content Delivery API

When utilising property lists in CMS v12 we found the content was not automatically being serialised and returned in the JSON Payload of the Content Delivery API v3.0

To overcome this, we implemented the IPropertyConverter interface found in the EPiServer.ContentApi.Core.Serialization namespace and registered using dependency injection.

Please be aware the Interface’s documentation does state it is currently in Preview State and could introduce breaking changes between minor versions.

To demonstrate the serialization of a property list I have used a simple example of a property list containing of a model containing two string properties.

Example Code:

Create a Property Model Inheriting EPiServer.ContentApi.Core.Serialization.Models.PropertyModel

    public class BenefitItemPropertyModel : PropertyModel<IEnumerable<BenefitItemModel>, PropertyList<BenefitItemModel>>
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="BenefitItemPropertyModel"/> class.
        /// </summary>
        /// <param name="type"></param>
        public BenefitItemPropertyModel(PropertyList<BenefitItemModel> type)
            : base(type)
        {
            Value = GetValues(type.List);
        }

        private IEnumerable<BenefitItemModel> GetValues(IList<BenefitItemModel> items)
        {
            return items.Select(x => new BenefitItemModel
            {
                BenefitText = x.BenefitText,
                BenefitIcon = x.BenefitIcon
            });
        }
    }

Implement the IPropertyConverter Interface and the Convert Method

    public class BenefitItemListPropertyConvertor : IPropertyConverter
    {
        /// <inheritdoc />
        public IPropertyModel Convert(PropertyData propertyData, ConverterContext contentMappingContext)
        {
            return new BenefitItemPropertyModel((PropertyList<BenefitItemModel>)propertyData);
        }
    }

Register the dependency in the Startup.cs Class

services.TryAddScoped<BenefitItemListPropertyConvertor>();

Having implemented the above you should get the following response from the content delivery API

                "displayOption": "col-6",
                "contentLink": {
                    "id": 146,
                    "workId": 0,
                    "guidValue": "83db556b-a029-4108-8b38-0cf4a29c9d9a",
                    "expanded": {
                        "contentLink": {
                            "id": 146,
                            "workId": 0,
                            "guidValue": "83db556b-a029-4108-8b38-0cf4a29c9d9a"
                        },
                        "name": " Benefits",
                        "contentType": [
                            "Block",
                            "BenefitsBlock"
                        ],
                        "theme": "green",
                        "benefits": [
                            {
                                "benefitIcon": "icon_pound",
                                "benefitText": "Lorem ipsum dolor sit amet"
                            },
                            {
                                "benefitIcon": "icon_pound",
                                "benefitText": "Lorem ipsum dolor sit amet"
                            }
                        ]
                    }
                }
            },
Feb 15, 2022

Please login to comment.