Skip to content

Commit af55d61

Browse files
authored
Merge pull request #2039 from microsoft/fix/json-node-serialization
fix/json node serialization
2 parents 6655ded + 4a50c77 commit af55d61

File tree

1 file changed

+46
-26
lines changed

1 file changed

+46
-26
lines changed

src/Microsoft.OpenApi/Writers/OpenApiWriterAnyExtensions.cs

Lines changed: 46 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT license.
33

4+
using System;
45
using System.Collections.Generic;
6+
using System.Globalization;
57
using System.Text.Json;
68
using System.Text.Json.Nodes;
79
using 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

Comments
 (0)