private static void TrySimplifyingJson(RavenJObject jObject, JsonSerializer jsonSerializer) { if (jObject.Tag == null) { return; } var resolveContract = jsonSerializer.ContractResolver.ResolveContract(jObject.Tag.GetType()); var objectContract = resolveContract as JsonObjectContract; if (objectContract == null) { return; } var deferredActions = new List <Action>(); foreach (var kvp in jObject) { var prop = kvp; if (prop.Value == null) { continue; } var obj = prop.Value as RavenJObject; if (obj == null) { continue; } var jsonProperty = objectContract.Properties.GetClosestMatchProperty(prop.Key); if (ShouldSimplifyJsonBasedOnType(obj.Value <string>("$type"), jsonProperty) == false) { continue; } if (obj.ContainsKey("$values") == false) { deferredActions.Add(() => obj.Remove("$type")); } else { deferredActions.Add(() => jObject[prop.Key] = obj["$values"]); } } foreach (var deferredAction in deferredActions) { deferredAction(); } foreach (var prop in jObject.Where(prop => prop.Value != null)) { switch (prop.Value.Type) { case JTokenType.Array: foreach (var item in ((RavenJArray)prop.Value)) { var ravenJObject = item as RavenJObject; if (ravenJObject != null) { TrySimplifyingJson(ravenJObject, jsonSerializer); } } break; case JTokenType.Object: TrySimplifyingJson((RavenJObject)prop.Value, jsonSerializer); break; } } }
private static void TrySimplifyingJson(RavenJObject jObject, JsonSerializer jsonSerializer) { if (jObject.Tag == null) return; var resolveContract = jsonSerializer.ContractResolver.ResolveContract(jObject.Tag.GetType()); var objectContract = resolveContract as JsonObjectContract; if (objectContract == null) return; var deferredActions = new List<Action>(); foreach (var kvp in jObject) { var prop = kvp; if (prop.Value == null) continue; var obj = prop.Value as RavenJObject; if (obj == null) continue; var jsonProperty = objectContract.Properties.GetClosestMatchProperty(prop.Key); if (ShouldSimplifyJsonBasedOnType(obj.Value<string>("$type"), jsonProperty) == false) continue; if (obj.ContainsKey("$values") == false) { deferredActions.Add(() => obj.Remove("$type")); } else { deferredActions.Add(() => jObject[prop.Key] = obj["$values"]); } } foreach (var deferredAction in deferredActions) { deferredAction(); } foreach (var prop in jObject.Where(prop => prop.Value != null)) { switch (prop.Value.Type) { case JTokenType.Array: foreach (var item in ((RavenJArray)prop.Value)) { var ravenJObject = item as RavenJObject; if (ravenJObject != null) TrySimplifyingJson(ravenJObject, jsonSerializer); } break; case JTokenType.Object: TrySimplifyingJson((RavenJObject)prop.Value, jsonSerializer); break; } } }