Imports System.Collections
Imports System.Collections.Generic
Imports System.Globalization
Imports System.Reflection
Imports System.ComponentModel.DataAnnotations
Imports Microsoft.VisualBasic
Imports System.Text.RegularExpressions
Imports Newtonsoft.Json.Linq
Imports Newtonsoft.Json.Converters
Imports Newtonsoft.Json.Serialization
Public Module JsonExtensions
Iterator Function DeserializeObjects(Of T)(ByVal stream As Stream, ByVal Optional settings As JsonSerializerSettings = Nothing) As IEnumerable(Of T)
Using textReader = New StreamReader(stream, Encoding.UTF8, true, 1024, true)
For Each item as T In DeserializeObjects(Of T)(textReader, settings)
Iterator Function DeserializeObjects(Of T)(ByVal textReader As TextReader, ByVal Optional settings As JsonSerializerSettings = Nothing) As IEnumerable(Of T)
Dim serializer = JsonSerializer.CreateDefault(settings)
Using reader = New JsonTextReader(textReader) With { .CloseInput = False }
If reader.TokenType = JsonToken.StartObject Then
Yield serializer.Deserialize(Of T)(reader)
Iterator Function DeserializeItemsByPath(Of T)(ByVal stream As Stream, regex as Regex, ByVal Optional settings As JsonSerializerSettings = Nothing) As IEnumerable(Of T)
Using textReader = New StreamReader(stream, Encoding.UTF8, true, 1024, true)
For Each item as T In DeserializeItemsByPath(Of T)(textReader, regex, settings)
Iterator Function DeserializeItemsByPath(Of T)(ByVal textReader As TextReader, ByVal regex as Regex, ByVal Optional settings As JsonSerializerSettings = Nothing) As IEnumerable(Of T)
Dim serializer = JsonSerializer.CreateDefault(settings)
Using reader = New JsonTextReader(textReader) With { .CloseInput = False }
If reader.TokenType <> JsonToken.PropertyName And regex.IsMatch(reader.Path)
Yield serializer.Deserialize(Of T)(reader)
Test3(JArray.Parse(GetJson())(0), 30000)
Friend Sub Test1(ByVal json As String)
Dim FileName = "Question74027865.json"
File.WriteAllText(FileName, json)
Using stream = File.OpenRead(FileName)
Dim regex as Regex = new Regex("^\[[0-9]+\]\.facilities\.totalSize\.value$", RegexOptions.CultureInvariant Or RegexOptions.Compiled Or RegexOptions.Singleline)
For Each value As Decimal in JsonExtensions.DeserializeItemsByPath(Of Decimal)(stream, regex)
Console.WriteLine("totalSize: {0}", value)
Friend Sub Test2(ByVal json As String)
Dim FileName = "Question74027865.json"
File.WriteAllText(FileName, json)
Using stream = File.OpenRead(FileName)
For Each jt As JObject in JsonExtensions.DeserializeObjects(Of JObject)(stream)
Dim valueToken as JToken = jt.SelectToken("facilities.totalSize.value")
If (valueToken IsNot Nothing)
Console.WriteLine("totalSize: {0}", valueToken)
Friend Sub Test3(Of T)(ByVal jObj as T, inCount as Integer)
Dim FileName = "Question74027865.json"
Using stream = File.OpenWrite(FileName)
Using textWriter = new StreamWriter(stream)
Using jsonWriter = new JsonTextWriter(textWriter)
JsonSerializer.CreateDefault().Serialize(textWriter, Enumerable.Range(0, inCount).Select(Function(i) jObj))
Dim total as Decimal = 0D
Using stream = File.OpenRead(FileName)
Dim regex as Regex = new Regex("^\[[0-9]+\]\.facilities\.totalSize\.value$", RegexOptions.CultureInvariant Or RegexOptions.Compiled Or RegexOptions.Singleline)
For Each value As Decimal in JsonExtensions.DeserializeItemsByPath(Of Decimal)(stream, regex)
Console.WriteLine("Grand total of {0} items: {1}.", count, total)
Function GetJson() as String
Dim Jstring As String = <![CDATA[
Console.WriteLine("Environment version: " & Environment.Version.ToString())
Console.WriteLine("Json.NET version: " & GetType(JsonSerializer).Assembly.FullName)
Console.WriteLine("Unhandled exception: ")
<System.Runtime.CompilerServices.Extension()>
Public Function ReadToContentAndAssert(ByVal reader As JsonReader) As JsonReader
Return JsonExtensions.ReadAndAssert(reader).MoveToContentAndAssert()
<System.Runtime.CompilerServices.Extension()>
Public Function MoveToContentAndAssert(ByVal reader As JsonReader) As JsonReader
If reader Is Nothing Then Throw New ArgumentNullException()
If reader.TokenType = JsonToken.None Then reader.ReadAndAssert()
While reader.TokenType = JsonToken.Comment
<System.Runtime.CompilerServices.Extension()>
Public Function ReadAndAssert(ByVal reader As JsonReader) As JsonReader
If reader Is Nothing Then Throw New ArgumentNullException()
If Not reader.Read() Then Throw New JsonReaderException("Unexpected end of JSON stream.")