Wednesday, March 12, 2014

Nhibernate, Abstract Base Classes and JSON.NET

While working on a project I ran into an issue where JSON.NET was not serializing and deserializing my nhibernate entities that used polymorphism. I found plenty of examples that showed how to do this with objects directly but none with Lists and Collections. This code isn't generic like it should be but worked for my purposes. So here is my code:

POCO:

 
[JsonConverter(typeof(LineItemConverter))]
public virtual ICollection LineItems { get; set; }

JsonConverter:

 
public class LineItemConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return typeof(LineItem).IsAssignableFrom(objectType);
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {

            var lineitems = JArray.Load(reader);
            var lineItemObjects = new List();


            foreach (var lineitem in lineitems)
            {
                switch (EnumUtil.ParseEnum(lineitem["lineItemType"].Value()))
                {
                    case LineItemType.Assessorial:
                        lineItemObjects.Add(lineitem.ToObject());
                        break;

                    case LineItemType.DeficitWeight:
                        lineItemObjects.Add(lineitem.ToObject());
                        break;

                    case LineItemType.Discount:
                        lineItemObjects.Add(lineitem.ToObject());
                        break;

                    case LineItemType.FloorAdjustment:
                        lineItemObjects.Add(lineitem.ToObject());
                        break;

                    case LineItemType.Freight:
                        lineItemObjects.Add(lineitem.ToObject());
                        break;

                    case LineItemType.Fuel:
                        lineItemObjects.Add(lineitem.ToObject());
                        break;

                    case LineItemType.Other:
                        lineItemObjects.Add(lineitem.ToObject());
                        break;

                    default:
                        break;

                } 
            }

            return lineItemObjects;
            
        }


        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {

            var lineitems = value as ICollection;
            serializer.Serialize(writer, lineitems.ToArray());
            
        }

No comments:

Post a Comment

Phoenix

I am resurrecting this tech blog for notes related to Azure Logic Apps with SAP.