// Spludlow Software // Copyright © Samuel P. Ludlow 2020 All Rights Reserved // Distributed under the terms of the GNU General Public License version 3 // Distributed WITHOUT ANY WARRANTY; without implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE // https://www.spludlow.co.uk/LICENCE.TXT // The Spludlow logo is a registered trademark of Samuel P. Ludlow and may not be used without permission // v1.14 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; using System.Data; namespace Spludlow.Data { public class JSON { public static void Write(DataSet dataSet, string filename) { using (FileStream stream = new FileStream(filename, FileMode.Create)) { Write(dataSet, stream); } } public static void Write(DataSet dataSet, Stream stream) { Encoding encoding = new UTF8Encoding(false); using (StreamWriter writer = new StreamWriter(stream, encoding)) { writer.WriteLine("{"); for (int tableIndex = 0; tableIndex < dataSet.Tables.Count; ++tableIndex) { bool trailingComma = tableIndex == dataSet.Tables.Count - 1 ? false : true; Write(dataSet.Tables[tableIndex], writer, trailingComma); } writer.WriteLine("}"); } } public static void Write(DataTable table, string filename) { using (FileStream stream = new FileStream(filename, FileMode.Create)) { Write(table, stream); } } public static void Write(DataTable table, Stream stream) { Encoding encoding = new UTF8Encoding(false); using (StreamWriter writer = new StreamWriter(stream, encoding)) { writer.WriteLine("{"); Write(table, writer, false); writer.WriteLine("}"); } } public static void Write(DataTable table, StreamWriter writer, bool trailingComma) { writer.Write("\t\""); writer.Write(table.TableName); writer.WriteLine("\": ["); for (int rowIndex = 0; rowIndex < table.Rows.Count; ++rowIndex) { DataRow row = table.Rows[rowIndex]; writer.WriteLine("\t\t{"); Dictionary rowData = new Dictionary(); foreach (DataColumn column in table.Columns) { if (row.IsNull(column) == true) continue; string value = null; switch (column.DataType.Name) { case "String": value = (string)row[column]; if (value == "") { value = null; } else { value = "\"" + value.Replace(@"\", @"\\").Replace("\"", "\\\"") + "\""; } break; case "Int32": value = ((int)row[column]).ToString(); if (value == "0") value = null; break; case "Boolean": value = ((bool)row[column]).ToString().ToLower(); break; default: throw new ApplicationException(column.DataType.Name); } if (value != null) rowData.Add(column.ColumnName, value); } for (int columnIndex = 0; columnIndex < rowData.Keys.Count; ++columnIndex) { string columnName = rowData.Keys.ElementAt(columnIndex); writer.Write("\t\t\t\""); writer.Write(columnName); writer.Write("\":\t"); writer.Write(rowData[columnName]); if (columnIndex < (rowData.Count - 1)) writer.Write(","); writer.WriteLine(); } writer.Write("\t\t}"); if (rowIndex < (table.Rows.Count - 1)) writer.Write(","); writer.WriteLine(); } writer.Write("\t]"); if (trailingComma == true) writer.Write(","); writer.WriteLine(); } } }