3 using System.Collections.Generic;
6 using Newtonsoft.Json.Converters;
8 using Newtonsoft.Json.Tests.TestObjects;
11 namespace Newtonsoft.Json.Tests.Converters
13 public class DataTableConverterTests : TestFixtureBase
16 public void Deserialize()
29 DataTable deserializedDataTable = JsonConvert.DeserializeObject<DataTable>(json);
30 Assert.IsNotNull(deserializedDataTable);
32 Assert.AreEqual(string.Empty, deserializedDataTable.TableName);
33 Assert.AreEqual(2, deserializedDataTable.Columns.Count);
34 Assert.AreEqual("id", deserializedDataTable.Columns[0].ColumnName);
35 Assert.AreEqual(typeof(long), deserializedDataTable.Columns[0].DataType);
36 Assert.AreEqual("item", deserializedDataTable.Columns[1].ColumnName);
37 Assert.AreEqual(typeof(string), deserializedDataTable.Columns[1].DataType);
39 Assert.AreEqual(2, deserializedDataTable.Rows.Count);
41 DataRow dr1 = deserializedDataTable.Rows[0];
42 Assert.AreEqual(0, dr1["id"]);
43 Assert.AreEqual("item 0", dr1["item"]);
45 DataRow dr2 = deserializedDataTable.Rows[1];
46 Assert.AreEqual(1, dr2["id"]);
47 Assert.AreEqual("item 1", dr2["item"]);
51 public void Serialize()
53 // create a new DataTable.
54 DataTable myTable = new DataTable("blah");
56 // create DataColumn objects of data types.
57 DataColumn colString = new DataColumn("StringCol");
58 colString.DataType = typeof(string);
59 myTable.Columns.Add(colString);
61 DataColumn colInt32 = new DataColumn("Int32Col");
62 colInt32.DataType = typeof(int);
63 myTable.Columns.Add(colInt32);
65 DataColumn colBoolean = new DataColumn("BooleanCol");
66 colBoolean.DataType = typeof(bool);
67 myTable.Columns.Add(colBoolean);
69 DataColumn colTimeSpan = new DataColumn("TimeSpanCol");
70 colTimeSpan.DataType = typeof(TimeSpan);
71 myTable.Columns.Add(colTimeSpan);
73 DataColumn colDateTime = new DataColumn("DateTimeCol");
74 colDateTime.DataType = typeof(DateTime);
75 colDateTime.DateTimeMode = DataSetDateTime.Utc;
76 myTable.Columns.Add(colDateTime);
78 DataColumn colDecimal = new DataColumn("DecimalCol");
79 colDecimal.DataType = typeof(decimal);
80 myTable.Columns.Add(colDecimal);
82 // populate one row with values.
83 DataRow myNewRow = myTable.NewRow();
85 myNewRow["StringCol"] = "Item Name";
86 myNewRow["Int32Col"] = 2147483647;
87 myNewRow["BooleanCol"] = true;
88 myNewRow["TimeSpanCol"] = new TimeSpan(10, 22, 10, 15, 100);
89 myNewRow["DateTimeCol"] = new DateTime(2000, 12, 29, 0, 0, 0, DateTimeKind.Utc);
90 myNewRow["DecimalCol"] = 64.0021;
91 myTable.Rows.Add(myNewRow);
93 string json = JsonConvert.SerializeObject(myTable, Formatting.Indented);
96 ""StringCol"": ""Item Name"",
97 ""Int32Col"": 2147483647,
99 ""TimeSpanCol"": ""10.22:10:15.1000000"",
100 ""DateTimeCol"": ""\/Date(978048000000)\/"",
101 ""DecimalCol"": 64.0021
106 public class TestDataTableConverter : JsonConverter
108 public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
110 DataTable d = (DataTable) value;
111 writer.WriteValue(d.TableName);
114 public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
117 DataTable d = new DataTable((string)reader.Value);
122 public override bool CanConvert(Type objectType)
124 return (objectType == typeof (DataTable));
129 public void PassedInJsonConverterOverridesInternalConverter()
131 DataTable t1 = new DataTable("Custom");
133 string json = JsonConvert.SerializeObject(t1, Formatting.Indented, new TestDataTableConverter());
134 Assert.AreEqual(@"""Custom""", json);
136 DataTable t2 = JsonConvert.DeserializeObject<DataTable>(json, new TestDataTableConverter());
137 Assert.AreEqual(t1.TableName, t2.TableName);