1

I am trying to serialize a c# object with an enum property to JSON using and format its enum values as numbers using EnumResolver.UnderlyingValue, however when I do so an exception is thrown. How can I prevent this exception?

I have these classes below:

[DataContract]
public class Physics
{
    [DataMember]
    public string Lecturer { get; set; }

    [DataMember]
    public WeekDays WeekDay { get; set; }
}

[DataContract]
public enum WeekDays : byte
{
    [EnumMember]
    Monday = 1,

    [EnumMember]
    Tuesday,

    [EnumMember]
    Wednesday,

    [EnumMember]
    Thursday,

    [EnumMember]
    Friday,

    [EnumMember]
    Saturday,

    [EnumMember]
    Sunday
}

Here is my Main() method.

static void Main(string[] args)
{
    Physics physics_1 = new Physics { Lecturer = "Andrew", WeekDay = WeekDays.Monday };
    var v1 = JsonSerializer.Serialize(physics_1, EnumResolver.UnderlyingValue);
    Console.WriteLine(Encoding.UTF8.GetString(v1));
}

I want to serialize a Physics object and also I want the enum member of Physics to be serialized as a number. But upon using EnumResolver.UnderlyingValue I got an exception Physics is not registered in this resolver:

Utf8Json.FormatterNotRegisteredException: Physics is not registered in this resolver. resolver:EnumUnderlyingValueResolver
   at Utf8Json.JsonFormatterResolverExtensions.GetFormatterWithVerify[T](IJsonFormatterResolver resolver)
   at Utf8Json.JsonSerializer.Serialize[T](T value, IJsonFormatterResolver resolver)

How can I serialize my object as required?

dbc
  • 104,963
  • 20
  • 228
  • 340
Arman
  • 33
  • 5

1 Answers1

1

EnumResolver.UnderlyingValue only resolves formatters for Enum objects. In order to resolve formatters for other types you must combine it with a standard resolver using CompositeResolver e.g. like so:

public static class Utf8JsonConfiguration
{
    static public IJsonFormatterResolver Resolver { get; } = 
        CompositeResolver.Create(EnumResolver.UnderlyingValue, StandardResolver.Default);
}

And then later do:

var physics_1 = new Physics { Lecturer = "Andrew", WeekDay = WeekDays.Monday };
var v1 = JsonSerializer.Serialize(physics_1, Utf8JsonConfiguration.Resolver);

Which results in {"Lecturer":"Andrew","WeekDay":1} as required.

This is explained in more detail on the documentation page Utf8Json - Fast JSON Serializer for C#: Resolver.

Demo fiddle here.

dbc
  • 104,963
  • 20
  • 228
  • 340