private static object ConvertJsonValue(JProperty element, ResourceType resourceType, ResourceProperty resourceProperty, string propertyName, DocumentDbMetadata dbMetadata) { if (element == null) { return(null); } object propertyValue = null; bool convertValue; if (element.Value.Type == JTokenType.Object) { var document = element.Value; propertyValue = CreateDSPResource(document, dbMetadata, propertyName, DocumentDbMetadata.GetQualifiedTypePrefix(resourceType.Name)); convertValue = true; } else if (element.Value.Type == JTokenType.Array) { var jsonArray = element.Value.ToArray(); if (jsonArray.Any()) { propertyValue = ConvertJsonArray(JArray.FromObject(jsonArray), resourceType, propertyName, dbMetadata); } convertValue = false; } else if (element.Value.Type == JTokenType.Null && resourceProperty.Kind == ResourcePropertyKind.Collection) { propertyValue = ConvertJsonArray(new JArray(0), resourceType, propertyName, dbMetadata); convertValue = false; } else { propertyValue = ConvertRawValue(element.Value as JValue); convertValue = true; } if (propertyValue != null && convertValue) { var propertyType = resourceProperty.ResourceType.InstanceType; var underlyingNonNullableType = Nullable.GetUnderlyingType(resourceProperty.ResourceType.InstanceType); if (underlyingNonNullableType != null) { propertyType = underlyingNonNullableType; } propertyValue = Convert.ChangeType(propertyValue, propertyType); } return(propertyValue); }
private static object ConvertJsonArray(JArray jsonArray, ResourceType resourceType, string propertyName, DocumentDbMetadata dbMetadata) { if (jsonArray == null || jsonArray.Count == 0) { return(new object[0]); } bool isDocument = false; int nonNullItemCount = 0; for (int index = 0; index < jsonArray.Count; index++) { if (jsonArray[index].Type != JTokenType.Null) { if (jsonArray[index].Type == JTokenType.Object) { isDocument = true; } ++nonNullItemCount; } } object[] propertyValue = isDocument ? new DSPResource[nonNullItemCount] : new object[nonNullItemCount]; int valueIndex = 0; for (int index = 0; index < jsonArray.Count; index++) { if (jsonArray[index].Type != JTokenType.Null) { if (isDocument) { propertyValue[valueIndex++] = CreateDSPResource(jsonArray[index], dbMetadata, propertyName, DocumentDbMetadata.GetQualifiedTypePrefix(resourceType.Name)); } else { propertyValue[valueIndex++] = ConvertRawValue(jsonArray[index] as JValue); } } } return(propertyValue); }