Skip to content

Instantly share code, notes, and snippets.

@Orbittman
Created December 9, 2021 16:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Orbittman/86b080fd45069fa83867729bdd0e2aaf to your computer and use it in GitHub Desktop.
Save Orbittman/86b080fd45069fa83867729bdd0e2aaf to your computer and use it in GitHub Desktop.
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