Imports System.Collections
Imports System.Collections.Generic
Imports System.Globalization
Imports System.Reflection
Imports System.ComponentModel.DataAnnotations
Imports Microsoft.VisualBasic
Imports Newtonsoft.Json.Linq
Imports Newtonsoft.Json.Converters
Imports Newtonsoft.Json.Serialization
Public Module DataTableJsonExtensions
Public Function ToOrderlines(ByVal table As DataTable) As JArray
Return ToOrderlines(table, table.Columns.Cast(Of DataColumn).Select(Function(c) c.ColumnName).ToArray())
Public Function ToOrderlines(ByVal table As DataTable, ByVal columns() As String, Optional ByVal culture As CultureInfo = Nothing, Optional ByVal formats As IDictionary(Of String, String) = Nothing) As JArray
culture = If (IsNothing(culture), CultureInfo.InvariantCulture, culture)
Dim array as JArray = New JArray
For Each row As DataRow In table.Rows
Dim obj As JObject = new JObject (
new JProperty("Orderlines",
New JObject(columns.Select(Function(c) New JProperty(c, String.Format(culture, If(Not IsNothing(formats) AndAlso formats.ContainsKey(c), formats(c), "{0}"), row(c)))))
Dim table As DataTable = New DataTable()
table.Columns.Add("Item", GetType(string))
table.Columns.Add("Quantity", GetType(double))
table.Columns.Add("Amount", GetType(decimal))
table.Columns.Add("foo", GetType(decimal))
Dim newRow As DataRow = table.NewRow()
Dim formats = New Dictionary(Of String, String) From {{"Amount", "{0}$"}}
Dim myArray as JArray = DataTableJsonExtensions.ToOrderlines(table, {"Item", "Quantity", "Amount"}, Nothing, formats)
Console.WriteLine("Orderlines for the three columns of the table with Amount formatting:")
Console.WriteLine(myArray)
Console.WriteLine("Default Orderlines for the entire table:")
Console.WriteLine(DataTableJsonExtensions.ToOrderlines(table))
Console.WriteLine("Orderlines for the three columns of the table:")
Console.WriteLine(DataTableJsonExtensions.ToOrderlines(table, {"Item", "Quantity", "Amount"}))
Console.WriteLine("Environment version: " & Environment.Version.ToString())
Console.WriteLine("Json.NET version: " & GetType(JsonSerializer).Assembly.FullName)
Console.WriteLine("Unhandled exception: ")