using System.Collections.Generic;
public static void Main()
var jsonToOne = "{'data': { 'type': 'Test', 'id': '1' } }";
var jsonToMany = "{'data': [{ 'type': 'Test', 'id': '1' }, { 'type': 'Test', 'id': '2' }]}";
var resultToOne = JsonConvert.DeserializeObject<Relation>(jsonToOne);
var resultToMany = JsonConvert.DeserializeObject<Relation>(jsonToMany);
Console.WriteLine("Type of to one: " + resultToOne.GetType());
Console.WriteLine("Type of to many: " + resultToMany.GetType());
[JsonConverter(typeof(RelationshipConverter))]
private abstract class Relation
public Dictionary<string, object> Meta { get; set; }
private class ToOneRelation : Relation
public object Data { get; set; }
private class ToManyRelation : Relation
public List<object> Data { get; set; }
private class RelationshipConverter : JsonConverter
public override bool CanWrite { get { return false; } }
public override bool CanConvert(Type objectType)
return objectType == typeof(Relation);
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotSupportedException();
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
if (reader.TokenType == JsonToken.StartObject)
List<object> toManyRelationshipData = null;
Dictionary<string, object> meta = null;
while (reader.TokenType == JsonToken.PropertyName)
string propertyName = reader.Value.ToString();
if (string.Equals(propertyName, "data", StringComparison.OrdinalIgnoreCase))
if (reader.TokenType == JsonToken.StartObject)
toOneData = serializer.Deserialize<object>(reader);
else if (reader.TokenType == JsonToken.StartArray)
toManyRelationshipData = serializer.Deserialize<List<object>>(reader);
else if (string.Equals(propertyName, "meta", StringComparison.OrdinalIgnoreCase))
meta = serializer.Deserialize<Dictionary<string, object>>(reader);
if (toManyRelationshipData == null)
return new ToManyRelation
Data = toManyRelationshipData,