@@ -17,7 +17,7 @@ protected Representation()
1717 }
1818
1919 [ JsonProperty ( "_embedded" ) ]
20- private ILookup < string , IResource > Embedded { get ; set ; }
20+ private IList < EmbeddedResource > Embedded { get ; set ; }
2121
2222 [ JsonIgnore ]
2323 readonly IDictionary < PropertyInfo , object > embeddedResourceProperties = new Dictionary < PropertyInfo , object > ( ) ;
@@ -33,27 +33,42 @@ private void OnSerialize(StreamingContext context)
3333 if ( ResourceConverter . IsResourceConverterContext ( context ) )
3434 {
3535 // put all embedded resources and lists of resources into Embedded for the _embedded serializer
36- var resourceList = new List < IResource > ( ) ;
36+ Embedded = new List < EmbeddedResource > ( ) ;
3737 foreach ( var prop in GetType ( ) . GetProperties ( ) . Where ( p => IsEmbeddedResourceType ( p . PropertyType ) ) )
3838 {
3939 var val = prop . GetValue ( this , null ) ;
40- if ( val != null )
40+ if ( val == null ) continue ;
41+ // remember embedded resource property for restoring after serialization
42+ embeddedResourceProperties . Add ( prop , val ) ;
43+ // add embedded resource to collection for the serializtion
44+ var res = val as IResource ;
45+ var embeddedResource = new EmbeddedResource ( ) ;
46+ if ( res != null )
4147 {
42- // remember embedded resource property for restoring after serialization
43- embeddedResourceProperties . Add ( prop , val ) ;
44- // add embedded resource to collection for the serializtion
45- var res = val as IResource ;
46- if ( res != null )
47- resourceList . Add ( res ) ;
48- else
49- resourceList . AddRange ( ( IEnumerable < IResource > ) val ) ;
50- // null out the embedded property so it doesn't serialize separately as a property
51- prop . SetValue ( this , null , null ) ;
48+ embeddedResource . IsSourceAnArray = false ;
49+ embeddedResource . Resources . Add ( res ) ;
50+ Embedded . Add ( embeddedResource ) ;
5251 }
52+ else
53+ {
54+ var resEnum = val as IEnumerable < IResource > ;
55+ if ( resEnum != null )
56+ {
57+ var resList = resEnum . ToList ( ) ;
58+ if ( resList . Count > 0 )
59+ {
60+ embeddedResource . IsSourceAnArray = true ;
61+ foreach ( var resElem in resList )
62+ embeddedResource . Resources . Add ( resElem ) ;
63+ Embedded . Add ( embeddedResource ) ;
64+ }
65+ }
66+ }
67+ // null out the embedded property so it doesn't serialize separately as a property
68+ prop . SetValue ( this , null , null ) ;
5369 }
54- foreach ( var res in resourceList . Where ( r => string . IsNullOrEmpty ( r . Rel ) ) )
55- res . Rel = "unknownRel-" + res . GetType ( ) . Name ;
56- Embedded = resourceList . Count > 0 ? resourceList . ToLookup ( r => r . Rel ) : null ;
70+ if ( Embedded . Count == 0 )
71+ Embedded = null ;
5772 }
5873 }
5974
@@ -77,7 +92,7 @@ internal static bool IsEmbeddedResourceType(Type type)
7792 public void RepopulateHyperMedia ( )
7893 {
7994 CreateHypermedia ( ) ;
80- if ( Links . Count ( l=> l . Rel == "self" ) == 0 )
95+ if ( ! string . IsNullOrEmpty ( Href ) && Links . Count ( l=> l . Rel == "self" ) == 0 )
8196 Links . Insert ( 0 , new Link { Rel = "self" , Href = Href } ) ;
8297 }
8398
@@ -94,4 +109,15 @@ public void RepopulateHyperMedia()
94109
95110 protected internal abstract void CreateHypermedia ( ) ;
96111 }
112+
113+ internal class EmbeddedResource
114+ {
115+ public EmbeddedResource ( )
116+ {
117+ Resources = new List < IResource > ( ) ;
118+ }
119+
120+ public bool IsSourceAnArray { get ; set ; }
121+ public IList < IResource > Resources { get ; private set ; }
122+ }
97123}
0 commit comments