1+ using System ;
2+ using System . Collections . Generic ;
3+ using Newtonsoft . Json . Serialization ;
4+ using System . Reflection ;
5+
6+ namespace FooBar . Web . Core . Json
7+ {
8+ //Inspired from http://stackoverflow.com/a/25150302/226589
9+ public class NullToEmptyListResolver : CamelCaseExceptDictionaryKeysResolver
10+ {
11+ protected override IValueProvider CreateMemberValueProvider ( MemberInfo member )
12+ {
13+ IValueProvider provider = base . CreateMemberValueProvider ( member ) ;
14+
15+ if ( member . MemberType == MemberTypes . Property )
16+ {
17+ Type propType = ( ( PropertyInfo ) member ) . PropertyType ;
18+ TypeInfo propTypeInfo = propType . GetTypeInfo ( ) ;
19+ if ( propTypeInfo . IsGenericType &&
20+ propType . GetGenericTypeDefinition ( ) == typeof ( List < > ) )
21+ {
22+ return new EmptyListValueProvider ( provider , propType ) ;
23+ }
24+ }
25+
26+ return provider ;
27+ }
28+
29+ class EmptyListValueProvider : IValueProvider
30+ {
31+ private IValueProvider innerProvider ;
32+ private object defaultValue ;
33+
34+ public EmptyListValueProvider ( IValueProvider innerProvider , Type listType )
35+ {
36+ this . innerProvider = innerProvider ;
37+ defaultValue = Activator . CreateInstance ( listType ) ;
38+ }
39+
40+ public void SetValue ( object target , object value )
41+ {
42+ innerProvider . SetValue ( target , value ?? defaultValue ) ;
43+ }
44+
45+ public object GetValue ( object target )
46+ {
47+ return innerProvider . GetValue ( target ) ?? defaultValue ;
48+ }
49+ }
50+ }
51+ }
0 commit comments