Skip to content

Augment converter classes to allow extensionsΒ #96

@Greven145

Description

@Greven145

I have a case where I want to use my strongly typed id as a dictionary key when deserializing from JSON.

{
  "values": {
    "5edc8eb5-ca2d-48ed-96d5-93b3e690912d": "some value",
    "1dc766ac-dbbb-4775-bf22-8ac655227099": "some other value",
  }
}

I'm using System.Text.Json and I get an error
The type 'MyId' is not a supported dictionary key using converter of type 'MyId+MyIdSystemTextJsonConverter'.

I can see two options, and maybe both would be useful

  1. Have the generated converter classes defined as partial classes. This would allow me to extend in code in my class with the additional overrides I might want
[StronglyTypedId]
public partial struct MyId {
    partial class MyIdSystemTextJsonConverter : JsonConverter<MyId>
    {
        /// <inheritdoc />
        public override MyId ReadAsPropertyName(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {
            var value = reader.GetString();
            return new MyId(Guid.Parse(value));
        }

        /// <inheritdoc />
        public override void WriteAsPropertyName(Utf8JsonWriter writer, MyId value, JsonSerializerOptions options) {
            writer.WriteStringValue(value.ToString());
        }
    }
}
  1. Add (by default or by some additional config) the implementations of ReadAsPropertyName and WriteAsPropertyName

Currently I cannot add a second [System.Text.Json.Serialization.JsonConverter(typeof(MyMyIdConverter))] attribute, so I'm forced to use JSON serializer options whenever I want to deserialize.

If you agree this/these are something you'd like, I'd be happy to open a pull request

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions