From 1a1c8e71fcd14858f595029f089b2d4a00202b32 Mon Sep 17 00:00:00 2001
From: ogi <Administrator@S-OGI-PC>
Date: Fri, 05 Dec 2025 09:24:16 +0900
Subject: [PATCH] プロジェクトファイルを追加。
---
HotelPms.Share/Util/DynamicJsonConverter.cs | 160 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 160 insertions(+), 0 deletions(-)
diff --git a/HotelPms.Share/Util/DynamicJsonConverter.cs b/HotelPms.Share/Util/DynamicJsonConverter.cs
new file mode 100644
index 0000000..052051f
--- /dev/null
+++ b/HotelPms.Share/Util/DynamicJsonConverter.cs
@@ -0,0 +1,160 @@
+using System.Dynamic;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+
+namespace HotelPms.Share.Util
+{
+ public class DynamicJsonConverter : JsonConverter<dynamic>
+ {
+ public override dynamic Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+ {
+
+ if (reader.TokenType == JsonTokenType.True)
+ {
+ return true;
+ }
+
+ if (reader.TokenType == JsonTokenType.False)
+ {
+ return false;
+ }
+
+ if (reader.TokenType == JsonTokenType.Number)
+ {
+ if (reader.TryGetInt64(out long l))
+ {
+ return l;
+ }
+
+ return reader.GetDouble();
+ }
+
+ if (reader.TokenType == JsonTokenType.String)
+ {
+ if (reader.TryGetDateTime(out DateTime datetime))
+ {
+ return datetime;
+ }
+
+ return reader.GetString();
+ }
+
+ if (reader.TokenType == JsonTokenType.StartObject)
+ {
+ using JsonDocument documentV = JsonDocument.ParseValue(ref reader);
+ return ReadObject(documentV.RootElement);
+ }
+
+ if (reader.TokenType == JsonTokenType.StartArray)
+ {
+ using JsonDocument documentV = JsonDocument.ParseValue(ref reader);
+ return ReadList(documentV.RootElement);
+ }
+
+ using JsonDocument document = JsonDocument.ParseValue(ref reader);
+ return document.RootElement.Clone();
+ }
+
+ private object ReadObject(JsonElement jsonElement)
+ {
+ IDictionary<string, object> expandoObject = new ExpandoObject();
+ foreach (var obj in jsonElement.EnumerateObject())
+ {
+ var k = obj.Name;
+ var value = ReadValue(obj.Value);
+ expandoObject[k] = value;
+ }
+ return expandoObject;
+ }
+
+ private object ReadValue(JsonElement jsonElement)
+ {
+ object result = null;
+ switch (jsonElement.ValueKind)
+ {
+ case JsonValueKind.Object:
+ result = ReadObject(jsonElement);
+ break;
+ case JsonValueKind.Array:
+ result = ReadList(jsonElement);
+ break;
+ case JsonValueKind.String:
+ result = jsonElement.GetString();
+ break;
+ case JsonValueKind.Number:
+ if (jsonElement.TryGetDecimal(out decimal d))
+ {
+ result = d;
+ }
+ else if (jsonElement.TryGetInt64(out long l))
+ {
+ result = l;
+ }
+ else
+ {
+ result = 0;
+ }
+ break;
+ case JsonValueKind.True:
+ result = true;
+ break;
+ case JsonValueKind.False:
+ result = false;
+ break;
+ case JsonValueKind.Undefined:
+ case JsonValueKind.Null:
+ result = null;
+ break;
+ default:
+ throw new ArgumentOutOfRangeException();
+ }
+ return result;
+ }
+
+ private object ReadList(JsonElement jsonElement)
+ {
+ IList<object> list = new List<object>();
+ foreach (var item in jsonElement.EnumerateArray())
+ {
+ list.Add(ReadValue(item));
+ }
+ return list.Count == 0 ? null : list;
+ }
+
+ public override void Write(Utf8JsonWriter writer, dynamic value, JsonSerializerOptions options)
+ {
+ // https://docs.microsoft.com/en-us/dotnet/api/system.typecode
+ switch (Type.GetTypeCode(value.GetType()))
+ {
+ case TypeCode.Boolean:
+ writer.WriteBooleanValue(Convert.ToBoolean(value));
+ break;
+ case TypeCode.Int16:
+ case TypeCode.Int32:
+ case TypeCode.Int64:
+ case TypeCode.UInt16:
+ case TypeCode.UInt32:
+ case TypeCode.UInt64:
+ writer.WriteNumberValue(Convert.ToInt64(value));
+ break;
+ case TypeCode.Decimal:
+ writer.WriteNumberValue(Convert.ToDecimal(value));
+ break;
+ case TypeCode.Char:
+ case TypeCode.Empty:
+ case TypeCode.String:
+ writer.WriteStringValue(Convert.ToString(value));
+ break;
+ case TypeCode.DateTime:
+ writer.WriteStringValue(Convert.ToDateTime(value).ToString("yyyy-MM-dd HH:mm:ss"));
+ break;
+ case TypeCode.DBNull:
+ writer.WriteNullValue();
+ break;
+ default:
+ writer.WriteRawValue(JsonSerializer.Serialize(value, new JsonSerializerOptions() { WriteIndented = true }));
+ break;
+ }
+ }
+ }
+}
\ No newline at end of file
--
Gitblit v1.10.0