-
Notifications
You must be signed in to change notification settings - Fork 1.3k
/
OpenApiAnyFactory.cs
80 lines (61 loc) · 2.6 KB
/
OpenApiAnyFactory.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
using System.Text.Json;
using Microsoft.OpenApi.Any;
namespace Swashbuckle.AspNetCore.SwaggerGen
{
public static class OpenApiAnyFactory
{
public static IOpenApiAny CreateFromJson(string json)
{
try
{
var jsonElement = JsonSerializer.Deserialize<JsonElement>(json);
return CreateFromJsonElement(jsonElement);
}
catch { }
return null;
}
private static IOpenApiAny CreateOpenApiArray(JsonElement jsonElement)
{
var openApiArray = new OpenApiArray();
foreach (var item in jsonElement.EnumerateArray())
{
openApiArray.Add(CreateFromJsonElement(item));
}
return openApiArray;
}
private static IOpenApiAny CreateOpenApiObject(JsonElement jsonElement)
{
var openApiObject = new OpenApiObject();
foreach (var property in jsonElement.EnumerateObject())
{
openApiObject.Add(property.Name, CreateFromJsonElement(property.Value));
}
return openApiObject;
}
private static IOpenApiAny CreateFromJsonElement(JsonElement jsonElement)
{
if (jsonElement.ValueKind == JsonValueKind.Null)
return new OpenApiNull();
if (jsonElement.ValueKind == JsonValueKind.True || jsonElement.ValueKind == JsonValueKind.False)
return new OpenApiBoolean(jsonElement.GetBoolean());
if (jsonElement.ValueKind == JsonValueKind.Number)
{
if (jsonElement.TryGetInt32(out int intValue))
return new OpenApiInteger(intValue);
if (jsonElement.TryGetInt64(out long longValue))
return new OpenApiLong(longValue);
if (jsonElement.TryGetSingle(out float floatValue) && !float.IsInfinity(floatValue))
return new OpenApiFloat(floatValue);
if (jsonElement.TryGetDouble(out double doubleValue))
return new OpenApiDouble(doubleValue);
}
if (jsonElement.ValueKind == JsonValueKind.String)
return new OpenApiString(jsonElement.ToString());
if (jsonElement.ValueKind == JsonValueKind.Array)
return CreateOpenApiArray(jsonElement);
if (jsonElement.ValueKind == JsonValueKind.Object)
return CreateOpenApiObject(jsonElement);
throw new System.ArgumentException($"Unsupported value kind {jsonElement.ValueKind}");
}
}
}