Revision: 21077
Updated Code
at December 3, 2009 12:40 by jimfred
Updated Code
// Purpose of this code: to test and understand JSON usage in C#. // What it does: // Defines a datatype that is nested, with an array and enum // Creates and initializes and object // Converts to JSON string and back into a 2nd object and deep-equals the two (should be the same). // modifies the JSON string (only formatting) and converts back into a 3rd object and compares (should be the same). // modifies the data in the JSON string and converts back into a 4th object and compares (should be different). // Creates a totally different string with the same data as the initial object. Converts string to object. (should be the same). #region Declare a type that: [1] is nested, [2] has an enum, [3] has an array. public enum EmpType // example enum { salaried, hourly, contract, }; public class MyEmployee { public string name { get; set; } public string id { get; set; } public int age { get; set; } public bool ok { get; set; } public EmpType empType { get; set; } } public class MyTopLevel { public string s { get; set; } public List<MyEmployee> list; public int i { get; set; } // Equals effectively performs a deep equals with a slight chance of returning a false equals. public bool Equals(MyTopLevel that) { // Note, there's a one in 4,294,967,295 chance that this will provide a false equals // http://mikehadlow.blogspot.com/2006/11/using-memorystream-and-binaryformatter.html return this.GetHashCode() == that.GetHashCode(); } } #endregion // Allocate and initialize data MyTopLevel myObj_1 = new MyTopLevel { s = "asdf", list = new List<MyEmployee>() { new MyEmployee { name = "aaa", id = "111" , age = 30, ok=true , empType=EmpType.contract }, new MyEmployee { name = "bbb", id = "Cohen", age = 31, ok=false, empType=EmpType.hourly }, new MyEmployee { name = "ccc", id = "Biton", age = 20, ok=true , empType=EmpType.salaried }, }, i = 1234 }; DataContractJsonSerializer serializer = new DataContractJsonSerializer(myObj_1.GetType()); #region Serialize MemoryStream ms1 = new MemoryStream(); serializer.WriteObject(ms1, myObj_1); string str = Encoding.Default.GetString(ms1.ToArray()); MessageBox.Show(str); #endregion #region Deserialization string str2 = str.Replace(",", ",\n");// This will change the formatting of the string without changing the data. MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(str2)); MyTopLevel myObj_2 = serializer.ReadObject(ms) as MyTopLevel; ms.Close(); // Test the reconstituted object - it should be deep-equal to the first object. System.Diagnostics.Debug.Assert(myObj_1.Equals(myObj_2)); #endregion #region Test !Equals using an object created from modified data string str = str.Replace("aaa", "aa"); // change an element of the serialized data to test .Equals(). ms = new MemoryStream(Encoding.Unicode.GetBytes(str)); MyTopLevel myObj_3 = serializer.ReadObject(ms) as MyTopLevel; ms.Close(); // Test the reconstitued object. It should not be deep-equal to the first object because of the str.Replace(). System.Diagnostics.Debug.Assert(!myObj_1.Equals(myObj_3)); #endregion // Generate a string expecting to create an object identical (deep equal) to the first object. // Omit empType 0 expecting it to result in the default of zero. // Add indentation and white spaces. str = "{" + " \"i\":1234,\n" + " \"list\":\n" + " [\n" + " {\"age\":30, \"empType\":2, \"id\":\"111\", \"name\":\"aaa\", \"ok\":true },\n" + " {\"age\":31, \"empType\":1, \"id\":\"Cohen\", \"name\":\"bbb\", \"ok\":false},\n" + " {\"age\":20, \"id\":\"Biton\", \"name\":\"ccc\", \"ok\":true }\n" + " ],\n" + " \"s\":\"asdf\"\n" + "}\n"; MessageBox.Show(str); ms = new MemoryStream(Encoding.Unicode.GetBytes(str)); MyTopLevel myObj_4 = serializer.ReadObject(ms) as MyTopLevel; ms.Close(); // Test the reconstitued object. It should not be deep-equal to the first object because of the str.Replace(). System.Diagnostics.Debug.Assert(!myObj_1.Equals(myObj_4));
Revision: 21076
Updated Code
at December 3, 2009 12:40 by jimfred
Updated Code
// Purpose of this code: to test and understand JSON usage in C#. // What it does: // Defines a datatype that is nested, with an array and enum // Creates and initializes and object // Converts to JSON string and back into a 2nd object and deep-equals the two (should be the same). // modifies the JSON string (only formatting) and converts back into a 3rd object and compares (should be the same). // modifies the data in the JSON string and converts back into a 4th object and compares (should be different). // Creates a totally different string with the same data as the initial object. Converts string to object. (should be the same). #region Declare a type that: [1] is nested, [2] has an enum, [3] has an array. public enum EmpType // example enum { salaried, hourly, contract, }; public class MyEmployee { public string name { get; set; } public string id { get; set; } public int age { get; set; } public bool ok { get; set; } public EmpType empType { get; set; } } public class MyTopLevel { public string s { get; set; } public List<MyEmployee> list; public int i { get; set; } // Equals effectively performs a deep equals with a slight chance of returning a false equals. public bool Equals(MyTopLevel that) { // Note, there's a one in 4,294,967,295 chance that this will provide a false equals // http://mikehadlow.blogspot.com/2006/11/using-memorystream-and-binaryformatter.html return this.GetHashCode() == that.GetHashCode(); } } #endregion // Allocate and initialize data MyTopLevel myObj_1 = new MyTopLevel { s = "asdf", list = new List<MyEmployee>() { new MyEmployee { name = "aaa", id = "111" , age = 30, ok=true , empType=EmpType.contract }, new MyEmployee { name = "bbb", id = "Cohen", age = 31, ok=false, empType=EmpType.hourly }, new MyEmployee { name = "ccc", id = "Biton", age = 20, ok=true , empType=EmpType.salaried }, }, i = 1234 }; DataContractJsonSerializer serializer = new DataContractJsonSerializer(myObj_1.GetType()); #region Serialize MemoryStream ms1 = new MemoryStream(); serializer.WriteObject(ms1, myObj_1); string str = Encoding.Default.GetString(ms1.ToArray()); MessageBox.Show(str); #endregion #region Deserialization string str2 = str.Replace(",", ",\n");// This will change the formatting of the string without changing the data. MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(str2)); MyTopLevel myObj_2 = serializer.ReadObject(ms) as MyTopLevel; ms.Close(); // Test the reconstituted object - it should be deep-equal to the first object. System.Diagnostics.Debug.Assert(myObj_1.Equals(myObj_2)); #endregion #region Test !Equals using an object created from modified data string str = str.Replace("aaa", "aa"); // change an element of the serialized data to test .Equals(). ms = new MemoryStream(Encoding.Unicode.GetBytes(str)); MyTopLevel myObj_3 = serializer.ReadObject(ms) as MyTopLevel; ms.Close(); // Test the reconstitued object. It should not be deep-equal to the first object because of the str.Replace(). System.Diagnostics.Debug.Assert(!myObj_1.Equals(myObj_3)); #endregion // Generate a string expecting to create an object identical (deep equal) to the first object. // Omit empType 0 expecting it to result in the default of zero. // Add indentation and white spaces. str = "{" + " \"i\":1234,\n" + " \"list\":\n" + " [\n" + " {\"age\":30, \"empType\":2, \"id\":\"111\", \"name\":\"aaa\", \"ok\":true },\n" + " {\"age\":31, \"empType\":1, \"id\":\"Cohen\", \"name\":\"bbb\", \"ok\":false},\n" + " {\"age\":20, \"id\":\"Biton\", \"name\":\"ccc\", \"ok\":true }\n" + " ],\n" + " \"s\":\"asdf\"\n" + "}\n"; MessageBox.Show(str); ms = new MemoryStream(Encoding.Unicode.GetBytes(str)); MyTopLevel myObj_4 = serializer.ReadObject(ms) as MyTopLevel; ms.Close(); // Test the reconstitued object. It should not be deep-equal to the first object because of the str.Replace(). System.Diagnostics.Debug.Assert(!myObj_1.Equals(myObj_4));
Revision: 21075
Updated Code
at December 3, 2009 12:26 by jimfred
Updated Code
#region Declare a type that: [1] is nested, [2] has an enum, [3] has an array. public enum EmpType // example enum { salaried, hourly, contract, }; public class MyEmployee { public string name { get; set; } public string id { get; set; } public int age { get; set; } public bool ok { get; set; } public EmpType empType { get; set; } } public class MyTopLevel { public string s { get; set; } public List<MyEmployee> list; public int i { get; set; } // Equals effectively performs a deep equals with a slight chance of returning a false equals. public bool Equals(MyTopLevel that) { // Note, there's a one in 4,294,967,295 chance that this will provide a false equals // http://mikehadlow.blogspot.com/2006/11/using-memorystream-and-binaryformatter.html return this.GetHashCode() == that.GetHashCode(); } } #endregion // Allocate and initialize data MyTopLevel myObj_1 = new MyTopLevel { s = "asdf", list = new List<MyEmployee>() { new MyEmployee { name = "aaa", id = "111" , age = 30, ok=true , empType=EmpType.contract }, new MyEmployee { name = "bbb", id = "Cohen", age = 31, ok=false, empType=EmpType.hourly }, new MyEmployee { name = "ccc", id = "Biton", age = 20, ok=true , empType=EmpType.salaried }, }, i = 1234 }; DataContractJsonSerializer serializer = new DataContractJsonSerializer(myObj_1.GetType()); #region Serialize MemoryStream ms1 = new MemoryStream(); serializer.WriteObject(ms1, myObj_1); string str = Encoding.Default.GetString(ms1.ToArray()); MessageBox.Show(str); #endregion #region Deserialization string str2 = str.Replace(",", ",\n");// This will change the formatting of the string without changing the data. MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(str2)); MyTopLevel myObj_2 = serializer.ReadObject(ms) as MyTopLevel; ms.Close(); // Test the reconstituted object - it should be deep-equal to the first object. System.Diagnostics.Debug.Assert(myObj_1.Equals(myObj_2)); #endregion #region Test !Equals using an object created from modified data string str = str.Replace("aaa", "aa"); // change an element of the serialized data to test .Equals(). ms = new MemoryStream(Encoding.Unicode.GetBytes(str)); MyTopLevel myObj_3 = serializer.ReadObject(ms) as MyTopLevel; ms.Close(); // Test the reconstitued object. It should not be deep-equal to the first object because of the str.Replace(). System.Diagnostics.Debug.Assert(!myObj_1.Equals(myObj_3)); #endregion // Generate a string expecting to create an object identical (deep equal) to the first object. // Omit empType 0 expecting it to result in the default of zero. // Add indentation and white spaces. str = "{" + " \"i\":1234,\n" + " \"list\":\n" + " [\n" + " {\"age\":30, \"empType\":2, \"id\":\"111\", \"name\":\"aaa\", \"ok\":true },\n" + " {\"age\":31, \"empType\":1, \"id\":\"Cohen\", \"name\":\"bbb\", \"ok\":false},\n" + " {\"age\":20, \"id\":\"Biton\", \"name\":\"ccc\", \"ok\":true }\n" + " ],\n" + " \"s\":\"asdf\"\n" + "}\n"; MessageBox.Show(str); ms = new MemoryStream(Encoding.Unicode.GetBytes(str)); MyTopLevel myObj_4 = serializer.ReadObject(ms) as MyTopLevel; ms.Close(); // Test the reconstitued object. It should not be deep-equal to the first object because of the str.Replace(). System.Diagnostics.Debug.Assert(!myObj_1.Equals(myObj_4));
Revision: 21074
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at December 2, 2009 18:34 by jimfred
Initial Code
// Added using System.ServiceModel.Web; // for DataContractJsonSerializer. Need reference too. using System.Runtime.Serialization.Json; // for DataContractJsonSerializer // Create a test data type. public enum EmpType // example enum { salaried, hourly, contract, }; public class Employee { public string name { get; set; } public string id { get; set; } public int age { get; set; } public bool ok { get; set; } public EmpType empType { get; set; } } // Allocate data List<Employee> myObject = new List<Employee>() { new Employee { name = "aaa", id = "111" , age = 30, ok=true , empType=EmpType.contract }, new Employee { name = "bbb", id = "Cohen", age = 31, ok=false, empType=EmpType.hourly }, new Employee { name = "ccc", id = "Biton", age = 20, ok=true , empType=EmpType.salaried }, }; DataContractJsonSerializer serializer = new DataContractJsonSerializer(myObject.GetType()); // Serialize MemoryStream ms = new MemoryStream(); serializer.WriteObject(ms, myObject); string str = Encoding.Default.GetString(ms.ToArray()); MessageBox.Show(str); // Deserialization ms = new MemoryStream(Encoding.Unicode.GetBytes(str)); List<Employee> myObject2 = serializer.ReadObject(ms) as List<Employee>; ms.Close(); // myObject2 same as myObject.
Initial URL
Initial Description
Initial Title
Trivial JSON example, serialization and deserialization
Initial Tags
Initial Language
C#