public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            var     r          = new ShardStore();
            JObject o          = JObject.Load(reader);
            var     properties = o.Properties().ToListOrNullIfEmpty();
            var     id         = properties.First();

            properties.AddRange(id.Value.Value <JObject>().Properties());

            r.Id = id.Name;

            foreach (var p in properties)
            {
                switch (p.Name)
                {
                case "name":
                    r.Name = p.Value.Value <string>();
                    break;

                case "transport_address":
                    r.TransportAddress = p.Value.Value <string>();
                    break;

                case "legacy_version":
                    r.LegacyVersion = p.Value.Value <long?>();
                    break;

                case "store_exception":
                    r.StoreException = p.Value.ToObject <ShardStoreException>();
                    break;

                case "allocation":
                    r.Allocation = p.Value.ToObject <ShardStoreAllocation>();
                    break;

                case "allocation_id":
                    r.AllocationId = p.Value.Value <string>();
                    break;

                case "attributes":
                    r.Attributes = p.Value.ToObject <Dictionary <string, object> >();
                    break;
                }
            }
            return(r);
        }
		public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
		{
			var r = new ShardStore();
			JObject o = JObject.Load(reader);
			var properties = o.Properties().ToListOrNullIfEmpty();
			var id = properties.First();
			properties.AddRange(id.Value.Value<JObject>().Properties());

			r.Id = id.Name;

			foreach (var p in properties)
			{
				switch(p.Name)
				{
					case "name":
						r.Name = p.Value.Value<string>();
						break;
					case "transport_address":
						r.TransportAddress = p.Value.Value<string>();
						break;
					case "version":
						r.Version = p.Value.Value<long>();
						break;
					case "store_exception":
						r.StoreException = p.Value.ToObject<ShardStoreException>();
						break;
					case "allocation":
						r.Allocation = p.Value.ToObject<ShardStoreAllocation>();
						break;
					case "attributes":
						r.Attributes = p.Value.ToObject<Dictionary<string, object>>();
						break;
				}
			}
			return r;
		}