123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- using System;
- using System.Collections.Generic;
- using System.Dynamic;
- using System.Text.Json;
- using System.Text.Json.Serialization;
- namespace Mpeg4ConverterTool
- {
- /// <summary>
- /// Temp Dynamic Converter
- /// </summary>
- 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.TryGetInt32(out int i))
- {
- return i;
- }
- if (reader.TryGetInt64(out long l))
- {
- return l;
- }
- if (reader.TryGetDecimal(out decimal d))
- {
- return d;
- }
- return reader.GetDouble();
- }
- if (reader.TokenType == JsonTokenType.String)
- {
- if (reader.TryGetDateTime(out DateTime datetime))
- {
- return datetime;
- }
- if(reader.TryGetBytesFromBase64(out byte[] byteResult))
- {
- return byteResult;
- }
- return reader.GetString();
- }
- if (reader.TokenType == JsonTokenType.StartObject)
- {
- using JsonDocument documentV = JsonDocument.ParseValue(ref reader);
- return ReadObject(documentV.RootElement);
- }
- // Use JsonElement as fallback.
- // Newtonsoft uses JArray or JObject.
- 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:
- //TODO: Missing Datetime&Bytes Convert
- if(jsonElement.TryGetDateTime(out DateTime dtResult))
- {
- result = dtResult;
- break;
- }
- if(jsonElement.TryGetBytesFromBase64(out byte[] byteResult))
- {
- result = byteResult;
- break;
- }
- result = jsonElement.GetString();
- break;
- case JsonValueKind.Number:
- //TODO: more num type
- if (jsonElement.TryGetInt32(out int i))
- {
- result = i;
- break;
- }
- if (jsonElement.TryGetInt64(out long l))
- {
- result = l;
- break;
- }
- if (jsonElement.TryGetDecimal(out decimal d))
- {
- result = d;
- break;
- }
- result = jsonElement.GetDouble();
- 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,
- object value,
- JsonSerializerOptions options)
- {
- // writer.WriteStringValue(value.ToString());
- }
- }
- }
|