I
I
Ivan2015-05-07 22:19:03
JSON
Ivan, 2015-05-07 22:19:03

JSON.net does not serialize a single property in an object, why would that be?

Good afternoon!
I inherited a project that actively uses this library, and for several days now I have been puzzling over such a problem: JsonConvert.SerializeObject for some reason skips one Integer field in the object. They are what I already checked: [JsonIgnore] is not used, there is nothing criminal in the ContractResolver either. In general, the ideas are over. Can someone suggest something?
Class code:

<System.Diagnostics.DebuggerStepThroughAttribute(),  _
     System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0"),  _
     System.Runtime.Serialization.DataContractAttribute(Name:="Document", [Namespace]:="http://schemas.datacontract.org/2004/07/Greenway.PrimeSuite.DataContracts.Documen"& _ 
        "t")>  _
    Partial Public Class Document
        Inherits Object
        Implements System.Runtime.Serialization.IExtensibleDataObject
        
        Private extensionDataField As System.Runtime.Serialization.ExtensionDataObject
        
        Private DocumentIdField As Integer
        
        Private DocumentIdSpecifiedField As Boolean
        
        Private SequenceNumberField As Integer
        
        Public Property ExtensionData() As System.Runtime.Serialization.ExtensionDataObject Implements System.Runtime.Serialization.IExtensibleDataObject.ExtensionData
            Get
                Return Me.extensionDataField
            End Get
            Set
                Me.extensionDataField = value
            End Set
        End Property
        
        <System.Runtime.Serialization.DataMemberAttribute()>  _
        Public Property DocumentId() As Integer
            Get
                Return Me.DocumentIdField
            End Get
            Set
                Me.DocumentIdField = value
            End Set
        End Property
        
        <System.Runtime.Serialization.DataMemberAttribute()>  _
        Public Property DocumentIdSpecified() As Boolean
            Get
                Return Me.DocumentIdSpecifiedField
            End Get
            Set
                Me.DocumentIdSpecifiedField = value
            End Set
        End Property
        
        <System.Runtime.Serialization.DataMemberAttribute()>  _
        Public Property SequenceNumber() As Integer
            Get
                Return Me.SequenceNumberField
            End Get
            Set
                Me.SequenceNumberField = value
            End Set
        End Property
    End Class

Serialization code:
private static string GetJsonExample(object instance, Type body)
        {

           
            var settings = new JsonSerializerSettings { ContractResolver = new SpecialContractResolver() };
            return JsonConvert.SerializeObject(instance, Newtonsoft.Json.Formatting.Indented, new JsonSerializerSettings { ContractResolver = new SpecialContractResolver() }); //

        }

Special Contract Resolver:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System.Runtime.Serialization;


namespace Greenway.Services.API.Rest.Docs
{
    public class SpecialContractResolver : DefaultContractResolver
    {
        protected override IValueProvider CreateMemberValueProvider(MemberInfo member)
        {

            if (member.MemberType == MemberTypes.Property)
            {

                var pi = (PropertyInfo)member;
                if (pi.PropertyType.IsGenericType && pi.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
                {

                    return new NullableValueProvider(member, pi.PropertyType.GetGenericArguments().First());
                }
                else if (pi.PropertyType.IsGenericType && pi.PropertyType.GetGenericTypeDefinition() == typeof(List<>))
                {


                    var listType = typeof(List<>);
                    var constructedListType = listType.MakeGenericType(pi.PropertyType);

                    return new NullableValueProvider(member, pi.PropertyType);
                }
                else if (pi.PropertyType.IsClass && member.Name != "ExtensionData" && !pi.PropertyType.IsPrimitive && !pi.PropertyType.IsValueType && pi.PropertyType != typeof(String))
                {

                    return new NullableValueProvider(member, pi.PropertyType);
                }
                else if (pi.PropertyType.Name == "String")
                {
                    return new NullableValueProvider(member, pi.PropertyType);
                }



            }
            else if (member.MemberType == MemberTypes.Field)
            {

                var fi = (FieldInfo)member;
                if (fi.FieldType.IsGenericType && fi.FieldType.GetGenericTypeDefinition() == typeof(Nullable<>))
                    return new NullableValueProvider(member, fi.FieldType.GetGenericArguments().First());
            }


            return base.CreateMemberValueProvider(member);
        }
    }



    public class NullableValueProvider : IValueProvider
    {
        private readonly object _defaultValue;
        private readonly object _defaultValue1;
        private readonly IValueProvider _underlyingValueProvider;


        public NullableValueProvider(MemberInfo memberInfo, Type underlyingType)
        {
            var pi = (PropertyInfo)memberInfo;
            _underlyingValueProvider = new DynamicValueProvider(memberInfo);
            if (pi.PropertyType.Name == "String")
                _defaultValue = "String Content";

            else if (pi.PropertyType.IsGenericType && pi.PropertyType.GetGenericTypeDefinition() == typeof(List<>))
            {
                 _defaultValue1 = Activator.CreateInstance(pi.PropertyType.GetGenericArguments().First());

                Type myObject = _defaultValue1.GetType();
                var IListRef = typeof(List<>);
                Type[] IListParam = { myObject };
                _defaultValue = Activator.CreateInstance(IListRef.MakeGenericType(IListParam));


                _defaultValue.GetType().GetMethod("Add").Invoke(_defaultValue, new[] { _defaultValue1 });
            }

            else if (underlyingType.IsArray)
            {

                Array _defaultValue2 = Array.CreateInstance(underlyingType.GetElementType(), 1);
                var tmp = Activator.CreateInstance(underlyingType.GetElementType());
                _defaultValue2.SetValue(tmp, 0);
                _defaultValue = _defaultValue2;


            }
            else
            {
                _defaultValue = Activator.CreateInstance(underlyingType);
                var temp = "";
            }
        }




        public void SetValue(object target, object value)
        {

            _underlyingValueProvider.SetValue(target, value);
        }

        public object GetValue(object target)
        {

            if (_underlyingValueProvider.GetValue(target) != null)
            {

                return _underlyingValueProvider.GetValue(target);
            }
            else
            {

                return _defaultValue;

            }
        }
    }


}

Answer the question

In order to leave comments, you need to log in

1 answer(s)
V
Vitaly Pukhov, 2015-05-08
@Neuroware

class code to studio, and serialization code

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question