Imports System.Collections
Imports System.Collections.Generic
Imports System.Globalization
Imports System.Text.RegularExpressions
Imports Newtonsoft.Json.Linq
Imports Newtonsoft.Json.Converters
Imports Newtonsoft.Json.Serialization
Public Module JsonExtensions
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)
Friend Sub TestPath(ByVal json As String)
Dim FileName = "Question74027865.json"
File.WriteAllText(FileName, json)
Using textReader = New StreamReader(FileName)
Using jsonReader = new JsonTextREader(textReader)
Dim root = CType(JToken.Load(jsonReader), JContainer)
Dim propertyName = "value"
Dim actualPath = root.DescendantsAndSelf().Where(Function(t) t.Path.EndsWith(propertyName)).Select((Function(t) t.Path)).FirstOrDefault()
Console.WriteLine("Searching for a path ending in ""{0}"" resulted in actual path ""{1}""", propertyName, actualPath)
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("^listings\[[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)
Dim regex as Regex = new Regex("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)
Function GetJson() as String
Dim Jstring As String = <![CDATA[
"generatedAt":"2022-05-02 02:03:25",
"neighborhood":"Finthen",
Console.WriteLine("Environment version: " & Environment.Version.ToString())
Console.WriteLine("Json.NET version: " & GetType(JsonSerializer).Assembly.FullName)
Console.WriteLine("Unhandled exception: ")