Skip to content

Commit 514fb4c

Browse files
committed
Write out primitive type values
1 parent ac797e8 commit 514fb4c

File tree

2 files changed

+44
-17
lines changed

2 files changed

+44
-17
lines changed

src/Microsoft.OpenApi/Writers/OpenApiWriterAnyExtensions.cs

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public static void WriteAny(this IOpenApiWriter writer, JsonNode node)
5252
return;
5353
}
5454

55-
JsonElement element = JsonSerializer.Deserialize<JsonElement>(node);
55+
var element = JsonDocument.Parse(node.ToJsonString()).RootElement;
5656
switch (element.ValueKind)
5757
{
5858
case JsonValueKind.Array: // Array
@@ -62,16 +62,13 @@ public static void WriteAny(this IOpenApiWriter writer, JsonNode node)
6262
writer.WriteObject(node as JsonObject);
6363
break;
6464
case JsonValueKind.String: // Primitive
65-
writer.WritePrimitive(node as JsonValue);
65+
writer.WritePrimitive(element);
6666
break;
6767
case JsonValueKind.Number: // Primitive
68-
writer.WritePrimitive(node as JsonValue);
68+
writer.WritePrimitive(element);
6969
break;
70-
case JsonValueKind.True: // Primitive
71-
writer.WritePrimitive(node as JsonValue);
72-
break;
73-
case JsonValueKind.False: // Primitive
74-
writer.WritePrimitive(node as JsonValue);
70+
case JsonValueKind.True or JsonValueKind.False: // Primitive
71+
writer.WritePrimitive(element);
7572
break;
7673
case JsonValueKind.Null: // null
7774
writer.WriteNull();
@@ -126,22 +123,53 @@ private static void WriteObject(this IOpenApiWriter writer, JsonObject entity)
126123
writer.WriteEndObject();
127124
}
128125

129-
private static void WritePrimitive(this IOpenApiWriter writer, JsonValue primitive)
126+
private static void WritePrimitive(this IOpenApiWriter writer, JsonElement primitive)
130127
{
131128
if (writer == null)
132129
{
133130
throw Error.ArgumentNull(nameof(writer));
134131
}
135132

136-
if (primitive == null)
133+
if (primitive.ValueKind == JsonValueKind.String)
137134
{
138-
throw Error.ArgumentNull(nameof(primitive));
135+
// check whether string is actual string or date time object
136+
if (primitive.TryGetDateTime(out var dateTime))
137+
{
138+
writer.WriteValue(dateTime);
139+
}
140+
else if (primitive.TryGetDateTimeOffset(out var dateTimeOffset))
141+
{
142+
writer.WriteValue(dateTimeOffset);
143+
}
144+
else
145+
{
146+
writer.WriteValue(primitive.GetString());
147+
}
139148
}
140149

141-
writer.WriteAny(primitive);
142-
143-
// The Spec version is meaning for the Any type, so it's ok to use the latest one.
144-
//primitive.Write(writer, OpenApiSpecVersion.OpenApi3_0);
150+
if (primitive.ValueKind == JsonValueKind.Number)
151+
{
152+
if (primitive.TryGetDecimal(out var decimalValue))
153+
{
154+
writer.WriteValue(decimalValue);
155+
}
156+
else if (primitive.TryGetDouble(out var doubleValue))
157+
{
158+
writer.WriteValue(doubleValue);
159+
}
160+
else if (primitive.TryGetInt64(out var longValue))
161+
{
162+
writer.WriteValue(longValue);
163+
}
164+
else if (primitive.TryGetInt32(out var intValue))
165+
{
166+
writer.WriteValue(intValue);
167+
}
168+
}
169+
if (primitive.ValueKind is JsonValueKind.True or JsonValueKind.False)
170+
{
171+
writer.WriteValue(primitive.GetBoolean());
172+
}
145173
}
146174
}
147175
}

test/Microsoft.OpenApi.Tests/Writers/OpenApiWriterAnyExtensionsTests.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -272,8 +272,7 @@ private static string WriteAsJson(JsonNode any, bool produceTerseOutput = false)
272272

273273
// Act
274274
var value = new StreamReader(stream).ReadToEnd();
275-
var element = JsonSerializer.Deserialize<JsonElement>(any);
276-
275+
var element = JsonDocument.Parse(value).RootElement;
277276
return element.ValueKind switch
278277
{
279278
JsonValueKind.String => value,

0 commit comments

Comments
 (0)