using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text.RegularExpressions;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public string TestString { get; set; }
public ArrayList Items { get; private set; }
this.Items = new ArrayList();
this.UnrelatedItems = new ArrayList();
public ArrayList UnrelatedItems { get; private set; }
public class NestedTestClass
public static void Main()
var myObject = new MyTestClass();
myObject.TestString = "hello";
myObject.Items.Add(new string[] { "Test1", "Test2" });
myObject.UnrelatedItems.Add(new NestedTestClass());
var jsonResult = JsonConvert.SerializeObject(myObject);
Console.WriteLine("Initial JSON: ");
Console.WriteLine(jsonResult);
var tempMyObject = JsonConvert.DeserializeObject<MyTestClass>(jsonResult,
new JsonSerializerSettings { Converters = { new MyTestClassConverter() } });
var reserializedJson = JsonConvert.SerializeObject(tempMyObject,
new JsonSerializerSettings { Formatting = Formatting.Indented, TypeNameHandling = TypeNameHandling.All });
Console.WriteLine("Reserialized JSON: ");
Console.WriteLine(reserializedJson);
Assert.Equal(myObject.TestString, tempMyObject.TestString);
Assert.Equal((myObject.Items[0] as string[])[0], (tempMyObject.Items[0] as string[])[0]);
public class MyTestClassConverter : JsonConverter
public override bool CanWrite { get { return false; } }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
if (reader.TokenType == JsonToken.Null)
var root = existingValue as MyTestClass ?? (MyTestClass)serializer.ContractResolver.ResolveContract(objectType).DefaultCreator();
var jsonObject = JObject.Load(reader);
var jsonItems = jsonObject["Items"].RemoveFromLowestPossibleParent();
if (jsonItems != null && jsonItems.Type != JTokenType.Null)
root.Items.AddRange(jsonItems.ToObject<List<string []>>());
using (var subReader = jsonObject.CreateReader())
serializer.Populate(subReader, root);
public override bool CanConvert(Type objectType)
return typeof(MyTestClass).IsAssignableFrom(objectType);
public static class JsonExtensions
public static JToken RemoveFromLowestPossibleParent(this JToken node)
var contained = node.AncestorsAndSelf().Where(t => t.Parent is JContainer && t.Parent.Type != JTokenType.Property).FirstOrDefault();
if (node.Parent is JProperty)
((JProperty)node.Parent).Value = null;
public static class Assert
public static void Equal<T>(T expected, T actual)
if (null != actual && !actual.Equals(expected))
throw new InvalidOperationException("Assert Failed");
else if (!expected.Equals(actual))
throw new InvalidOperationException("Assert Failed");