Chris Walsh
Chris Walsh

Reputation: 3523

Selecting a NamingStrategy when using a JsonConverter on a class property

I've got a c# class that I am trying to correctly serialise using Newtonsoft.Json. The property is an enumeration type and I wish the value to be serialised as the "lowercase version of the enumeration name". There is a JsonConverterAttribute available for specifying this on the property and also a prewritten StringEnumConverter but I need to specify the CamelCaseNamingStrategy on that converter but I can't work out the syntax.

I've tried to assign it on the property itself:

public class C
{
    [JsonConverter(typeof(StringEnumConverter),NamingStrategy=typeof(CamelCaseNamingStrategy))]
    public ChartType ChartType { get; set; }
}

and I've also tried adding it similarly onto the enumeration type itself:

[JsonConverter(typeof(StringEnumConverter),NamingStrategy=typeof(CamelCaseNamingStrategy))]
public enum ChartType { Pie, Bar }

But the syntax is wrong. I can't find any examples of this in the Newtonsoft documentation.

The desired serialision would be: "ChartType":"pie" or "ChartType":"bar"

Any ideas? Thanks.

Upvotes: 9

Views: 14083

Answers (3)

emilast
emilast

Reputation: 569

This works for me for enabling camel casing on a single place in a .Net Core web api:

[JsonConverter(typeof(StringEnumConverter), true)]

Note that you can append constructor parameters to the type given by the first parameter and StringEnumConverter has the following overloaded constructor:

StringEnumConverter(bool camelCaseText)

Of course, enabling this globally is normally preferred, as discussed here for example.

Upvotes: 2

Chris Walsh
Chris Walsh

Reputation: 3523

Okay, this appears to work:

[JsonProperty("type")] 
[JsonConverter(typeof(StringEnumConverter), 
     converterParameters:typeof(CamelCaseNamingStrategy))]
public ChartType ChartType { get; }  

As NamingStrategy is a property of the StringEnumConverter it's applied using the converterParameters parameter. This got my desired output. I think an example of this would be useful in Newtonsoft documentation.

Upvotes: 13

Alexander
Alexander

Reputation: 9632

Another possible solution is using JsonSerializerSettings

var settings = new JsonSerializerSettings
{
    Converters = new List<JsonConverter> {
        new StringEnumConverter(new CamelCaseNamingStrategy())
    }
};
var result = JsonConvert.SerializeObject(obj, settings);

Upvotes: 9

Related Questions