I am trying to serialize a .NET DataTable to a JSON file and then deserialize the JSON file back to a DataTable. I just realized what I think.
However, I have a table, 3 rows of 3 columns, each element is of type double. If any value in the first row is NULL, when JSON.Net deserializes the json file into a DataTable, all the values ββof the column that was empty in the first row become rows.
To be clear, only if the value in the first line is null, this will happen. If any values ββare zero on any other row than the first, the remaining values ββin this column remain doubled.
If I replaced null with double, everything will work as expected (I cannot do this in my case, however).
If I set NullValueHandling = NullValueHandling.Ignore, all values ββwill be doubled, except that the first line will now be indicated as the last line:
Example:
"Column2": 1.0, "Column3": 1.1 }, { "Column1": 0.0, "Column2": 0.5, "Column3": 2.0 },
becomes:
"Column2": 1.0, "Column3": 1.1 }, { "Column2": 0.5, "Column3": 2.0, "Column1": 0.0 },
I need to be able to deserialize JSON, keep the columns in order and not have null values ββin the first row so that all values ββin this row become rows. I also need to leave column 1 of the first row (in the case above) null - don't care if it is an empty row or DBNull.
Any thoughts? (My test code is below ..comment / uncomment NullValueHandling to see the problem)
DataTable table = new DataTable("MyTable"); table.Columns.Add("Column1", typeof(double)); table.Columns.Add("Column2", typeof(double)); table.Columns.Add("Column3", typeof(double)); for (int i = 0; i < 10; i++) { if (i == 0) table.Rows.Add(null, 1.0, 1.1); else table.Rows.Add(0.0, 0.5, 2.0); } JsonSerializer serializer = new JsonSerializer(); //serializer.TypeNameHandling = TypeNameHandling.All; serializer.NullValueHandling = NullValueHandling.Ignore; using (StreamWriter sw1 = new StreamWriter("1st.json")) using (JsonWriter writer1 = new JsonTextWriter(sw1)) { writer1.Formatting = Formatting.Indented; serializer.Serialize(writer1, table); } DataTable newtable; using (StreamReader sr = new StreamReader("1st.json")) using (JsonReader reader = new JsonTextReader(sr)) { newtable = (DataTable)serializer.Deserialize(reader, typeof(DataTable)); } using (StreamWriter sw = new StreamWriter("3rd.json")) using (JsonWriter writer = new JsonTextWriter(sw)) { writer.Formatting = Formatting.Indented; serializer.Serialize(writer, newtable); }