public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) return null; reader.Assert(JsonToken.StartObject); string toString = null; string idObj = null; string typeStr = null; Entity entity = null; reader.Read(); while (reader.TokenType == JsonToken.PropertyName) { switch ((string)reader.Value) { case "toStr": toString = reader.ReadAsString(); break; case "id": idObj = reader.ReadAsString(); break; case "EntityType": typeStr = reader.ReadAsString(); break; case "entity": reader.Read(); entity = (Entity)serializer.Deserialize(reader, typeof(Entity)); break; default: throw new InvalidOperationException("unexpected property " + (string)reader.Value); } reader.Read(); } reader.Assert(JsonToken.EndObject); Type type = TypeLogic.GetType(typeStr); PrimaryKey? idOrNull = idObj == null ? (PrimaryKey?)null : PrimaryKey.Parse(idObj, type); if (entity == null) return Lite.Create(type, idOrNull.Value, toString); var result = entity.ToLiteFat(toString); if (result.EntityType != type) throw new InvalidOperationException("Types don't match"); if (result.IdOrNull != idOrNull) throw new InvalidOperationException("Id's don't match"); var existing = existingValue as Lite<Entity>; if (existing.Is(result) && existing.EntityOrNull == null && result.EntityOrNull != null) { existing.SetEntity(result.EntityOrNull); return existing; } return result; }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) return null; using (EntityCache ec = new EntityCache()) { reader.Assert(JsonToken.StartObject); bool markedAsModified; ModifiableEntity mod = GetEntity(reader, objectType, existingValue, serializer, out markedAsModified); var pr = JsonSerializerExtensions.CurrentPropertyRoute; if (pr == null || mod is IRootEntity) pr = PropertyRoute.Root(mod.GetType()); else if (pr.Type.ElementType() == objectType) pr = pr.Add("Item"); //Because we have a custom MListJsonConverter but not for other simpler collections var dic = PropertyConverter.GetPropertyConverters(mod.GetType()); while (reader.TokenType == JsonToken.PropertyName) { if ((string)reader.Value == "mixins") { var entity = (Entity)mod; reader.Read(); reader.Assert(JsonToken.StartObject); reader.Read(); while (reader.TokenType == JsonToken.PropertyName) { var mixin = entity[(string)reader.Value]; reader.Read(); using (JsonSerializerExtensions.SetCurrentPropertyRoute(pr.Add(mixin.GetType()))) serializer.DeserializeValue(reader, mixin.GetType(), mixin); reader.Read(); } reader.Assert(JsonToken.EndObject); reader.Read(); } else { PropertyConverter pc = dic.GetOrThrow((string)reader.Value); reader.Read(); ReadJsonProperty(reader, serializer, mod, pc, pr, markedAsModified); reader.Read(); } } reader.Assert(JsonToken.EndObject); AfterDeserilization.Invoke(mod); return mod; } }