using System.Collections.Generic;
using Newtonsoft.Json.Linq;
public static void Main()
Root root = JsonConvert.DeserializeObject<Root>(json);
Console.WriteLine("Item 1 Field1: " + root.Item1?.Field1);
Console.WriteLine("Item 1 Field2: " + root.Item1?.Field2);
Console.WriteLine("Item 2 Field1: " + root.Item2?.Field1);
Console.WriteLine("Item 2 Field2: " + root.Item2?.Field2);
Console.WriteLine("All Items:");
foreach (var item in root.Items)
Console.WriteLine("Field1: " + item?.Field1);
Console.WriteLine("Field2: " + item?.Field2);
[JsonConverter(typeof(RootConverter))]
public Item Item1 { get; set; }
public Item Item2 { get; set; }
public string Field1 { get; set; }
public string Field2 { get; set; }
public string Bar { get; set; }
public class RootConverter : JsonConverter
public override bool CanConvert(Type objectType)
return objectType == typeof(Root);
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
JObject obj = JObject.Load(reader);
serializer.Populate(obj.CreateReader(), root);
root.Items = obj.Properties()
.Where(p => p.Value.Type == JTokenType.Object && (p.Value["Field1"] != null || p.Value["Field2"] != null))
.Select(p => p.Value.ToObject<Item>())
public override bool CanWrite
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();