-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathJsonDocument.cls
More file actions
140 lines (114 loc) · 4.01 KB
/
JsonDocument.cls
File metadata and controls
140 lines (114 loc) · 4.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "JsonDocument"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = True
'@Exposed
'@Folder("JSON.Core")
Option Explicit
Private Const ModuleName As String = "Document"
Private Type TData
Value As IJson
End Type
Private This As TData
Public Sub LoadFrom(ByVal Reader As IReader)
On Error GoTo Error
Const FunctionName As String = "LoadFrom"
Dim ErrorLogger As ErrorLogger
Set ErrorLogger = Factory.CreateErrorLogger(ModuleName, FunctionName)
Dim Data As String
Data = Reader.Execute
Dim Length As Long
Length = Len(Data)
Dim Stream As StringStream
Set Stream = Service.CreateStringStream(Data)
Stream.EatSpaces
Set This.Value = Service.ParseValue(Stream)
Exit Sub
Error:
Err.Raise Err.Number, Err.Source, Err.Description & " at position " & Length - Len(Stream.Value) & " (" & Left$(Stream.Value, 20) & ")."
End Sub
Public Sub WriteTo(ByVal Writer As IWriter)
Const FunctionName As String = "WriteTo"
Dim ErrorLogger As ErrorLogger
Set ErrorLogger = Factory.CreateErrorLogger(ModuleName, FunctionName)
Writer.Execute This.Value.ToString
End Sub
Friend Function GetAs(ByVal DataType As JsonDataTypeEnum) As IJson
Const FunctionName As String = "GetAs"
Dim ErrorLogger As ErrorLogger
Set ErrorLogger = Factory.CreateErrorLogger(ModuleName, FunctionName)
Set GetAs = Service.GetAs(This.Value, DataType)
End Function
Public Function Query(ByVal XPath As String) As IJson
Const FunctionName As String = "Query"
Dim ErrorLogger As ErrorLogger
Set ErrorLogger = Factory.CreateErrorLogger(ModuleName, FunctionName)
Dim Path As Collection
Set Path = ParseXPath(XPath)
Dim Value As IJson
Set Value = This.Value
Dim Item As Variant
For Each Item In Path
If (IsNumeric(Item)) Then
Dim JsonArray As JsonArray
Set JsonArray = Service.GetAs(Value, jsondatatypeArray)
Set Value = JsonArray.Items(CLng(Item))
Else
Dim JsonObject As JsonObject
Set JsonObject = Service.GetAs(Value, JsonDataTypeObject)
Set Value = JsonObject.Items(Item).Value
End If
Next
Set Query = Value
End Function
Private Function ParseXPath(ByVal XPath As String) As Collection
Const FunctionName As String = "ParseXPath"
Dim ErrorLogger As ErrorLogger
Set ErrorLogger = Factory.CreateErrorLogger(ModuleName, FunctionName)
Dim Output As Collection
Set Output = New Collection
Dim Stream As StringStream
Set Stream = Service.CreateStringStream(XPath)
Stream.EatCharacter "/"
Dim Character As String
Do While Not Stream.EOF
Character = Stream.PeekCharacter
If (Character = "[") Then
Stream.EatCharacter "["
Dim Number As String
Number = ParseNumber(Stream)
Output.Add CInt(Number)
Stream.EatCharacter "]"
ElseIf (Character <> "/") Then
Dim Data As String
Data = ParseString(Stream)
Output.Add Data
Else
Stream.EatCharacter "/"
End If
Loop
Set ParseXPath = Output
End Function
Private Function ParseNumber(ByVal Stream As StringStream) As String
Const FunctionName As String = "ParseNumber"
Dim ErrorLogger As ErrorLogger
Set ErrorLogger = Factory.CreateErrorLogger(ModuleName, FunctionName)
Dim Number As String
Number = Stream.PeekString("^[1-9]\d*")
Stream.EatString Number
ParseNumber = Number
End Function
Private Function ParseString(ByVal Stream As StringStream) As String
Const FunctionName As String = "ParseString"
Dim ErrorLogger As ErrorLogger
Set ErrorLogger = Factory.CreateErrorLogger(ModuleName, FunctionName)
Dim Data As String
Data = Stream.PeekString("^[^\[/]+")
Stream.EatString Data
ParseString = Data
End Function