Created
December 9, 2021 16:38
-
-
Save Orbittman/86b080fd45069fa83867729bdd0e2aaf to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class DynamicJsonConverter : JsonConverter<object> | |
{ | |
public override object Read(ref Utf8JsonReader reader, | |
Type typeToConvert, | |
JsonSerializerOptions options) | |
{ | |
if (reader.TokenType == JsonTokenType.StartObject) | |
{ | |
using JsonDocument documentV = JsonDocument.ParseValue(ref reader); | |
return ReadObject(documentV.RootElement); | |
} | |
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: | |
if(jsonElement.TryGetDateTime(out var date)) | |
{ | |
result = date; | |
break; | |
} | |
result = jsonElement.GetString(); | |
break; | |
case JsonValueKind.Number: | |
result = 0; | |
if (jsonElement.TryGetInt32(out int i)) | |
{ | |
result = i; | |
break; | |
} | |
if (jsonElement.TryGetInt64(out long l)) | |
{ | |
result = l; | |
break; | |
} | |
if (jsonElement.TryGetInt16(out short s)) | |
{ | |
result = s; | |
break; | |
} | |
if (jsonElement.TryGetByte(out var bytes)) | |
{ | |
result = bytes; | |
break; | |
} | |
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) | |
{ | |
throw new NotImplementedException(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment