Example #1
0
        /// <summary>
        /// Serializes an object into a JSON string adding Properties.
        /// </summary>
        /// <param name="writer">The JSON writer.</param>
        /// <param name="value">The value to serialize.</param>
        /// <param name="serializer">The JSON serializer.</param>
        public override void WriteJson(JsonWriter writer,
                                       object value, JsonSerializer serializer)
        {
            if (writer == null)
            {
                throw new ArgumentNullException("writer");
            }
            if (value == null)
            {
                throw new ArgumentNullException("value");
            }
            if (serializer == null)
            {
                throw new ArgumentNullException("serializer");
            }

            // If generic resource - serialize as-is
            if (value.GetType().GetTypeInfo().DeclaredProperties.Any(p => p.Name == "Properties" && p.PropertyType == typeof(object)))
            {
                GetSerializerWithoutCurrentConverter(serializer).Serialize(writer, value);
                return;
            }

            // Add discriminator field
            writer.WriteStartObject();

            // If there is polymorphism - add polymorphic property
            var polymorphicSerializer = serializer.Converters
                                        .FirstOrDefault(c =>
                                                        c.GetType().GetTypeInfo().IsGenericType&&
                                                        c.GetType().GetGenericTypeDefinition() == typeof(PolymorphicSerializeJsonConverter <>) &&
                                                        c.CanConvert(value.GetType())) as PolymorphicJsonConverter;

            if (polymorphicSerializer != null)
            {
                writer.WritePropertyName(polymorphicSerializer.Discriminator);
                string typeName = value.GetType().Name;
                if (value.GetType().GetTypeInfo().GetCustomAttributes <JsonObjectAttribute>().Any())
                {
                    typeName = value.GetType().GetTypeInfo().GetCustomAttribute <JsonObjectAttribute>().Id;
                }
                writer.WriteValue(typeName);
            }

            // Go over each property that is in resource and write to stream
            JsonConverterHelper.SerializeProperties(writer, value, serializer,
                                                    p => !p.PropertyName.StartsWith("properties.", StringComparison.OrdinalIgnoreCase));

            // If there is a need to add properties element - add it
            var contract = (JsonObjectContract)serializer.ContractResolver.ResolveContract(value.GetType());

            if (contract.Properties.Any(p =>
                                        p.PropertyName.StartsWith("properties.", StringComparison.OrdinalIgnoreCase) &&
                                        (p.ValueProvider.GetValue(value) != null ||
                                         serializer.NullValueHandling == NullValueHandling.Include)))
            {
                writer.WritePropertyName(PropertiesNode);
                writer.WriteStartObject();
                JsonConverterHelper.SerializeProperties(writer, value, serializer,
                                                        p => p.PropertyName.StartsWith("properties.", StringComparison.OrdinalIgnoreCase));
                writer.WriteEndObject();
            }

            writer.WriteEndObject();
        }