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,71 @@ 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
- if ( writer == null )
114
- {
115
- Utils . CheckArgumentNull ( writer ) ;
116
- }
114
+ Utils . CheckArgumentNull ( writer ) ;
117
115
118
- if ( primitive . ValueKind == JsonValueKind . String )
116
+ var valueKind = primitive . GetValueKind ( ) ;
117
+
118
+ if ( valueKind == JsonValueKind . String && primitive is JsonValue jsonStrValue )
119
119
{
120
- // check whether string is actual string or date time object
121
- if ( primitive . TryGetDateTime ( out var dateTime ) )
120
+ if ( jsonStrValue . TryGetValue < DateTimeOffset > ( out var dto ) )
122
121
{
123
- writer . WriteValue ( dateTime ) ;
122
+ writer . WriteValue ( dto ) ;
124
123
}
125
- else if ( primitive . TryGetDateTimeOffset ( out var dateTimeOffset ) )
124
+ else if ( jsonStrValue . TryGetValue < DateTime > ( out var dt ) )
126
125
{
127
- writer . WriteValue ( dateTimeOffset ) ;
126
+ writer . WriteValue ( dt ) ;
128
127
}
129
- else
128
+ else if ( jsonStrValue . TryGetValue < string > ( out var strValue ) )
130
129
{
131
- writer . WriteValue ( primitive . GetString ( ) ) ;
130
+ // check whether string is actual string or date time object
131
+ if ( DateTimeOffset . TryParse ( strValue , CultureInfo . InvariantCulture , DateTimeStyles . RoundtripKind , out var dateTimeOffset ) )
132
+ {
133
+ writer . WriteValue ( dateTimeOffset ) ;
134
+ }
135
+ else if ( DateTime . TryParse ( strValue , CultureInfo . InvariantCulture , DateTimeStyles . RoundtripKind , out var dateTime ) )
136
+ { // order matters, DTO needs to be checked first!!!
137
+ writer . WriteValue ( dateTime ) ;
138
+ }
139
+ else
140
+ {
141
+ writer . WriteValue ( strValue ) ;
142
+ }
132
143
}
133
144
}
134
145
135
- if ( primitive . ValueKind == JsonValueKind . Number )
146
+ else if ( valueKind == JsonValueKind . Number && primitive is JsonValue jsonValue )
136
147
{
137
- if ( primitive . TryGetDecimal ( out var decimalValue ) )
148
+
149
+ if ( jsonValue . TryGetValue < decimal > ( out var decimalValue ) )
138
150
{
139
151
writer . WriteValue ( decimalValue ) ;
140
152
}
141
- else if ( primitive . TryGetDouble ( out var doubleValue ) )
153
+ else if ( jsonValue . TryGetValue < double > ( out var doubleValue ) )
142
154
{
143
155
writer . WriteValue ( doubleValue ) ;
144
156
}
145
- else if ( primitive . TryGetInt64 ( out var longValue ) )
157
+ else if ( jsonValue . TryGetValue < float > ( out var floatValue ) )
158
+ {
159
+ writer . WriteValue ( floatValue ) ;
160
+ }
161
+ else if ( jsonValue . TryGetValue < long > ( out var longValue ) )
146
162
{
147
163
writer . WriteValue ( longValue ) ;
148
164
}
149
- else if ( primitive . TryGetInt32 ( out var intValue ) )
165
+ else if ( jsonValue . TryGetValue < int > ( out var intValue ) )
150
166
{
151
167
writer . WriteValue ( intValue ) ;
152
168
}
153
169
}
154
- if ( primitive . ValueKind is JsonValueKind . True or JsonValueKind . False )
170
+ else if ( valueKind is JsonValueKind . False )
171
+ {
172
+ writer . WriteValue ( false ) ;
173
+ }
174
+ else if ( valueKind is JsonValueKind . True )
155
175
{
156
- writer . WriteValue ( primitive . GetBoolean ( ) ) ;
176
+ writer . WriteValue ( true ) ;
157
177
}
158
178
}
159
179
}
0 commit comments