1
1
// Copyright (c) Microsoft Corporation. All rights reserved.
2
2
// Licensed under the MIT license.
3
3
4
+ using System ;
4
5
using System . Collections . Generic ;
6
+ using System . Globalization ;
5
7
using System . Text . Json ;
6
8
using System . Text . Json . Nodes ;
7
9
using Microsoft . OpenApi . Any ;
@@ -49,16 +51,15 @@ public static void WriteExtensions(this IOpenApiWriter writer, IDictionary<strin
49
51
/// <param name="node">The JsonNode value</param>
50
52
public static void WriteAny ( this IOpenApiWriter writer , JsonNode node )
51
53
{
52
- Utils . CheckArgumentNull ( writer ) ; ;
54
+ Utils . CheckArgumentNull ( writer ) ;
53
55
54
56
if ( node == null )
55
57
{
56
58
writer . WriteNull ( ) ;
57
59
return ;
58
60
}
59
61
60
- var element = JsonDocument . Parse ( node . ToJsonString ( ) ) . RootElement ;
61
- switch ( element . ValueKind )
62
+ switch ( node . GetValueKind ( ) )
62
63
{
63
64
case JsonValueKind . Array : // Array
64
65
writer . WriteArray ( node as JsonArray ) ;
@@ -67,13 +68,13 @@ public static void WriteAny(this IOpenApiWriter writer, JsonNode node)
67
68
writer . WriteObject ( node as JsonObject ) ;
68
69
break ;
69
70
case JsonValueKind . String : // Primitive
70
- writer . WritePrimitive ( element ) ;
71
+ writer . WritePrimitive ( node ) ;
71
72
break ;
72
73
case JsonValueKind . Number : // Primitive
73
- writer . WritePrimitive ( element ) ;
74
+ writer . WritePrimitive ( node ) ;
74
75
break ;
75
76
case JsonValueKind . True or JsonValueKind . False : // Primitive
76
- writer . WritePrimitive ( element ) ;
77
+ writer . WritePrimitive ( node ) ;
77
78
break ;
78
79
case JsonValueKind . Null : // null
79
80
writer . WriteNull ( ) ;
@@ -108,52 +109,74 @@ private static void WriteObject(this IOpenApiWriter writer, JsonObject entity)
108
109
writer . WriteEndObject ( ) ;
109
110
}
110
111
111
- private static void WritePrimitive ( this IOpenApiWriter writer , JsonElement primitive )
112
+ private static void WritePrimitive ( this IOpenApiWriter writer , JsonNode primitive )
112
113
{
113
114
if ( writer == null )
114
115
{
115
116
Utils . CheckArgumentNull ( writer ) ;
116
117
}
117
118
118
- if ( primitive . ValueKind == JsonValueKind . String )
119
+ var valueKind = primitive . GetValueKind ( ) ;
120
+
121
+ if ( valueKind == JsonValueKind . String && primitive is JsonValue jsonStrValue )
119
122
{
120
- // check whether string is actual string or date time object
121
- if ( primitive . TryGetDateTime ( out var dateTime ) )
123
+ if ( jsonStrValue . TryGetValue < DateTimeOffset > ( out var dto ) )
122
124
{
123
- writer . WriteValue ( dateTime ) ;
125
+ writer . WriteValue ( dto ) ;
124
126
}
125
- else if ( primitive . TryGetDateTimeOffset ( out var dateTimeOffset ) )
127
+ else if ( jsonStrValue . TryGetValue < DateTime > ( out var dt ) )
126
128
{
127
- writer . WriteValue ( dateTimeOffset ) ;
129
+ writer . WriteValue ( dt ) ;
128
130
}
129
- else
131
+ else if ( jsonStrValue . TryGetValue < string > ( out var strValue ) )
130
132
{
131
- writer . WriteValue ( primitive . GetString ( ) ) ;
133
+ // check whether string is actual string or date time object
134
+ if ( DateTimeOffset . TryParse ( strValue , CultureInfo . InvariantCulture , DateTimeStyles . RoundtripKind , out var dateTimeOffset ) )
135
+ {
136
+ writer . WriteValue ( dateTimeOffset ) ;
137
+ }
138
+ else if ( DateTime . TryParse ( strValue , CultureInfo . InvariantCulture , DateTimeStyles . RoundtripKind , out var dateTime ) )
139
+ { // order matters, DTO needs to be checked first!!!
140
+ writer . WriteValue ( dateTime ) ;
141
+ }
142
+ else
143
+ {
144
+ writer . WriteValue ( strValue ) ;
145
+ }
132
146
}
133
147
}
134
148
135
- if ( primitive . ValueKind == JsonValueKind . Number )
149
+ else if ( valueKind == JsonValueKind . Number && primitive is JsonValue jsonValue )
136
150
{
137
- if ( primitive . TryGetDecimal ( out var decimalValue ) )
151
+
152
+ if ( jsonValue . TryGetValue < decimal > ( out var decimalValue ) )
138
153
{
139
154
writer . WriteValue ( decimalValue ) ;
140
155
}
141
- else if ( primitive . TryGetDouble ( out var doubleValue ) )
156
+ else if ( jsonValue . TryGetValue < double > ( out var doubleValue ) )
142
157
{
143
158
writer . WriteValue ( doubleValue ) ;
144
159
}
145
- else if ( primitive . TryGetInt64 ( out var longValue ) )
160
+ else if ( jsonValue . TryGetValue < float > ( out var floatValue ) )
161
+ {
162
+ writer . WriteValue ( floatValue ) ;
163
+ }
164
+ else if ( jsonValue . TryGetValue < long > ( out var longValue ) )
146
165
{
147
166
writer . WriteValue ( longValue ) ;
148
167
}
149
- else if ( primitive . TryGetInt32 ( out var intValue ) )
168
+ else if ( jsonValue . TryGetValue < int > ( out var intValue ) )
150
169
{
151
170
writer . WriteValue ( intValue ) ;
152
171
}
153
172
}
154
- if ( primitive . ValueKind is JsonValueKind . True or JsonValueKind . False )
173
+ else if ( valueKind is JsonValueKind . False )
174
+ {
175
+ writer . WriteValue ( false ) ;
176
+ }
177
+ else if ( valueKind is JsonValueKind . True )
155
178
{
156
- writer . WriteValue ( primitive . GetBoolean ( ) ) ;
179
+ writer . WriteValue ( true ) ;
157
180
}
158
181
}
159
182
}
0 commit comments