11// Copyright (c) Microsoft Corporation. All rights reserved.
22// Licensed under the MIT license.
33
4+ using System ;
45using System . Collections . Generic ;
6+ using System . Globalization ;
57using System . Text . Json ;
68using System . Text . Json . Nodes ;
79using Microsoft . OpenApi . Any ;
@@ -49,16 +51,15 @@ public static void WriteExtensions(this IOpenApiWriter writer, IDictionary<strin
4951 /// <param name="node">The JsonNode value</param>
5052 public static void WriteAny ( this IOpenApiWriter writer , JsonNode node )
5153 {
52- Utils . CheckArgumentNull ( writer ) ; ;
54+ Utils . CheckArgumentNull ( writer ) ;
5355
5456 if ( node == null )
5557 {
5658 writer . WriteNull ( ) ;
5759 return ;
5860 }
5961
60- var element = JsonDocument . Parse ( node . ToJsonString ( ) ) . RootElement ;
61- switch ( element . ValueKind )
62+ switch ( node . GetValueKind ( ) )
6263 {
6364 case JsonValueKind . Array : // Array
6465 writer . WriteArray ( node as JsonArray ) ;
@@ -67,13 +68,13 @@ public static void WriteAny(this IOpenApiWriter writer, JsonNode node)
6768 writer . WriteObject ( node as JsonObject ) ;
6869 break ;
6970 case JsonValueKind . String : // Primitive
70- writer . WritePrimitive ( element ) ;
71+ writer . WritePrimitive ( node ) ;
7172 break ;
7273 case JsonValueKind . Number : // Primitive
73- writer . WritePrimitive ( element ) ;
74+ writer . WritePrimitive ( node ) ;
7475 break ;
7576 case JsonValueKind . True or JsonValueKind . False : // Primitive
76- writer . WritePrimitive ( element ) ;
77+ writer . WritePrimitive ( node ) ;
7778 break ;
7879 case JsonValueKind . Null : // null
7980 writer . WriteNull ( ) ;
@@ -108,52 +109,71 @@ private static void WriteObject(this IOpenApiWriter writer, JsonObject entity)
108109 writer . WriteEndObject ( ) ;
109110 }
110111
111- private static void WritePrimitive ( this IOpenApiWriter writer , JsonElement primitive )
112+ private static void WritePrimitive ( this IOpenApiWriter writer , JsonNode primitive )
112113 {
113- if ( writer == null )
114- {
115- Utils . CheckArgumentNull ( writer ) ;
116- }
114+ Utils . CheckArgumentNull ( writer ) ;
117115
118- if ( primitive . ValueKind == JsonValueKind . String )
116+ var valueKind = primitive . GetValueKind ( ) ;
117+
118+ if ( valueKind == JsonValueKind . String && primitive is JsonValue jsonStrValue )
119119 {
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 ) )
122121 {
123- writer . WriteValue ( dateTime ) ;
122+ writer . WriteValue ( dto ) ;
124123 }
125- else if ( primitive . TryGetDateTimeOffset ( out var dateTimeOffset ) )
124+ else if ( jsonStrValue . TryGetValue < DateTime > ( out var dt ) )
126125 {
127- writer . WriteValue ( dateTimeOffset ) ;
126+ writer . WriteValue ( dt ) ;
128127 }
129- else
128+ else if ( jsonStrValue . TryGetValue < string > ( out var strValue ) )
130129 {
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+ }
132143 }
133144 }
134145
135- if ( primitive . ValueKind == JsonValueKind . Number )
146+ else if ( valueKind == JsonValueKind . Number && primitive is JsonValue jsonValue )
136147 {
137- if ( primitive . TryGetDecimal ( out var decimalValue ) )
148+
149+ if ( jsonValue . TryGetValue < decimal > ( out var decimalValue ) )
138150 {
139151 writer . WriteValue ( decimalValue ) ;
140152 }
141- else if ( primitive . TryGetDouble ( out var doubleValue ) )
153+ else if ( jsonValue . TryGetValue < double > ( out var doubleValue ) )
142154 {
143155 writer . WriteValue ( doubleValue ) ;
144156 }
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 ) )
146162 {
147163 writer . WriteValue ( longValue ) ;
148164 }
149- else if ( primitive . TryGetInt32 ( out var intValue ) )
165+ else if ( jsonValue . TryGetValue < int > ( out var intValue ) )
150166 {
151167 writer . WriteValue ( intValue ) ;
152168 }
153169 }
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 )
155175 {
156- writer . WriteValue ( primitive . GetBoolean ( ) ) ;
176+ writer . WriteValue ( true ) ;
157177 }
158178 }
159179 }
0 commit comments