Question41551530 using-newtonsoft-json-with-nested-custom-classes

CSharp · Console

/Program.cs

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;
using System.Collections.ObjectModel;
using System.Reflection;
using System.Text.RegularExpressions;

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;			
	

    // https://stackoverflow.com/questions/41551530/using-newtonsoft-json-with-nested-custom-classes

    internal class TestClass
    {
        internal static void Test()
        {

            MyClass1 c1 = new MyClass1();
            c1.AddInfo();

            string toJsonString = JsonConvert.SerializeObject(c1, Formatting.Indented,
                new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Include });
            Console.WriteLine("Initial JSON: ");
            Console.WriteLine(toJsonString);
            //File.WriteAllText(@"C:\temp\dumpJsonText.txt", toJsonString);
            MyClass1 fromJson = JsonConvert.DeserializeObject<MyClass1>(toJsonString);
            var json2 = JsonConvert.SerializeObject(fromJson, Formatting.Indented);

            Console.WriteLine("Deserialized and re-serialized JSON: ");
            Console.WriteLine(json2);

            if (!JToken.DeepEquals(JToken.Parse(toJsonString), JToken.Parse(json2)))
            {
                Console.WriteLine("Initial and re-serialized JSON are NOT EQUIVALENT!");
                throw new InvalidOperationException("(!JToken.DeepEquals(JToken.Parse(toJsonString), JToken.Parse(json2)))");
            }
            else
            {
                Console.WriteLine("Initial and re-serialized are equivalent.");
            }
        }
    }

    public class MyClass1 : List<MyClass2>
    {
        public MyClass1() { }
        public void AddInfo()
        {
            this.Add(new MyClass2(new string[] { "stringInput1", "stringInput2" },
              new char[] { 'a', 'b', 'c', '.' },
              "dummy",
              new List<MyClass3>() { new MyClass3("ListInput1", new Regex(@"[A-Z]")), new MyClass3("ListInput2", new Regex(@"[0-9]")) }
              ));
        }
    }

    public class MyClass2
    {
        private string[] _myStringArray = null;
        private char[] _myCharArray = null;
        private string _myString = null;
        private List<MyClass3> _myClass3Object = null;

        public MyClass2() { }

        [JsonConstructor]
        public MyClass2(string[] myStringArray, char[] myCharArray, string myString, List<MyClass3> myClass3Object)
        {
            _myStringArray = myStringArray;
            _myCharArray = myCharArray;
            _myString = myString;
            _myClass3Object = myClass3Object;
        }

        public string[] MyStringArray { get { return _myStringArray; } }
        public char[] MyCharArray { get { return _myCharArray; } }
        public string MyString { get { return _myString; } }
        public List<MyClass3> MyClass3Object { get { return _myClass3Object; } }

    }

    public class MyClass3
    {
        private Regex _myRegex;
        private string _myString = null;

        public MyClass3() { }

        [JsonConstructor]
        // The argument names must match the property names modulo case for Json.NET to deserialize the properties successfully.
        public MyClass3(string myString, Regex myRegex)
        {
            _myString = myString;
            _myRegex = myRegex;
        }

        public string MyString { get { return _myString; } }

        public Regex MyRegex { get { return _myRegex; } }
    }
				
	public class Program
	{
		public static void Main()
		{
            Console.WriteLine("Json.NET version: " + typeof(JsonSerializer).Assembly.FullName);

			TestClass.Test();
		}
	}
;