Skip to content

Instantly share code, notes, and snippets.

@momvart
Last active February 27, 2021 20:35
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 momvart/8a2e0f31e38edb89a375e771508bee0b to your computer and use it in GitHub Desktop.
Save momvart/8a2e0f31e38edb89a375e771508bee0b to your computer and use it in GitHub Desktop.
A converter for `System.Text.Json` that recursively parse converts json to the inferred types. Uses `ExpandoObject` for objects.
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Dynamic;
public class ObjectToInferredTypesConverter : JsonConverter<object>
{
public override object Read(
ref Utf8JsonReader reader,
Type typeToConvert,
JsonSerializerOptions options) =>
reader.TokenType switch
{
JsonTokenType.True => true,
JsonTokenType.False => false,
JsonTokenType.Number when reader.TryGetInt64(out long l) => l,
JsonTokenType.Number => reader.GetDouble(),
JsonTokenType.String when reader.TryGetDateTime(out DateTime datetime) => datetime,
JsonTokenType.String => reader.GetString(),
JsonTokenType.StartObject => JsonSerializer.Deserialize<ExpandoObject>(ref reader, options),
JsonTokenType.StartArray => JsonSerializer.Deserialize<IList<object>>(ref reader, options),
_ => JsonDocument.ParseValue(ref reader).RootElement.Clone()
};
public override void Write(
Utf8JsonWriter writer,
object objectToWrite,
JsonSerializerOptions options) =>
throw new InvalidOperationException("Not meant for serialization.");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment