Imports System.Collections
Imports System.Collections.Generic
Imports System.Globalization
Imports System.Reflection
Imports System.ComponentModel.DataAnnotations
Imports Newtonsoft.Json.Linq
Imports Newtonsoft.Json.Converters
Imports Newtonsoft.Json.Serialization
Imports Microsoft.VisualBasic
Sub PrintType(Of T)(ByVal Item As T)
Console.WriteLine(GetType(T))
Dim json as String = GetJson()
Dim obj As JObject = JObject.Parse(json)
Dim values = obj.DescendantsAndSelf().OfType(Of JProperty)().Where(Function(p) TypeOf p.Value Is JValue).GroupBy(Function(p) p.Name).ToList()
Dim columns = values.[Select](Function(g) g.Key).ToArray()
Dim parentsWithChildren = values.SelectMany(Function(g) g).SelectMany(Function(v) v.AncestorsAndSelf().OfType(Of JObject)().Skip(1)).ToHashSet()
Dim rows = obj.DescendantsAndSelf() _
.Where(Function(o) o.PropertyValues().OfType(Of JValue)().Any()) _
.Where(Function(o) o.Equals(obj) OrElse Not parentsWithChildren.Contains(o)) _
.Select(Function(o) columns.Select(Function(c) _
.Select(Function(parent) parent(c)) _
.Select(Function(v) CStr(v)) _
.SkipWhile(Function(s) s Is Nothing) _
Dim csvRows = Enumerable.Concat(Of IEnumerable(Of String))({columns}, rows) _
.Select(Function(r) String.Join(",", r))
Dim csv = String.Join(vbLf, csvRows)
Console.WriteLine("Output CSV:")
Console.WriteLine("Input JSON:")
PrintType({ columns.AsEnumerable() })
Function GetJson() as String
Dim Jstring As String = <![CDATA[
"timestamp": "1524781083.0",
"pl": "5127.4352653395923394"
"timestamp": "1531902193.0",
Console.WriteLine("Environment version: " & Environment.Version.ToString())
Console.WriteLine("Json.NET version: " & GetType(JsonSerializer).Assembly.FullName)
Console.WriteLine("Unhandled exception: ")