Selectively use default JSON converter
up vote
5
down vote
favorite
I use the following in my Web API project's Startup.cs to JSON-serialize Enums into strings:
// Configure JSON Serialization
var jsonSerializationSettings = GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
jsonSerializationSettings.Formatting = Newtonsoft.Json.Formatting.None;
jsonSerializationSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter());
This is to avoid decorating every Enum property with [JsonConverter(typeof(StringEnumConverter))]
Now, how can I selectively opt out of my global serialization setting for some Enum properties and use the default serializer that converts to integers?
c# asp.net asp.net-web-api json.net
add a comment |
up vote
5
down vote
favorite
I use the following in my Web API project's Startup.cs to JSON-serialize Enums into strings:
// Configure JSON Serialization
var jsonSerializationSettings = GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
jsonSerializationSettings.Formatting = Newtonsoft.Json.Formatting.None;
jsonSerializationSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter());
This is to avoid decorating every Enum property with [JsonConverter(typeof(StringEnumConverter))]
Now, how can I selectively opt out of my global serialization setting for some Enum properties and use the default serializer that converts to integers?
c# asp.net asp.net-web-api json.net
Ideally you shall only decorate the requiredpropertiesinstead of the Global setting
– Mrinal Kamboj
Sep 28 '16 at 5:30
Do you want to opt out for specific properties, or for specific enums?
– dbc
Sep 28 '16 at 5:49
@dcb For specific properties, probably by using an attribute.
– orad
Sep 28 '16 at 5:55
add a comment |
up vote
5
down vote
favorite
up vote
5
down vote
favorite
I use the following in my Web API project's Startup.cs to JSON-serialize Enums into strings:
// Configure JSON Serialization
var jsonSerializationSettings = GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
jsonSerializationSettings.Formatting = Newtonsoft.Json.Formatting.None;
jsonSerializationSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter());
This is to avoid decorating every Enum property with [JsonConverter(typeof(StringEnumConverter))]
Now, how can I selectively opt out of my global serialization setting for some Enum properties and use the default serializer that converts to integers?
c# asp.net asp.net-web-api json.net
I use the following in my Web API project's Startup.cs to JSON-serialize Enums into strings:
// Configure JSON Serialization
var jsonSerializationSettings = GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
jsonSerializationSettings.Formatting = Newtonsoft.Json.Formatting.None;
jsonSerializationSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter());
This is to avoid decorating every Enum property with [JsonConverter(typeof(StringEnumConverter))]
Now, how can I selectively opt out of my global serialization setting for some Enum properties and use the default serializer that converts to integers?
c# asp.net asp.net-web-api json.net
c# asp.net asp.net-web-api json.net
edited Sep 28 '16 at 6:07
dbc
52.3k765116
52.3k765116
asked Sep 28 '16 at 5:28
orad
5,534134982
5,534134982
Ideally you shall only decorate the requiredpropertiesinstead of the Global setting
– Mrinal Kamboj
Sep 28 '16 at 5:30
Do you want to opt out for specific properties, or for specific enums?
– dbc
Sep 28 '16 at 5:49
@dcb For specific properties, probably by using an attribute.
– orad
Sep 28 '16 at 5:55
add a comment |
Ideally you shall only decorate the requiredpropertiesinstead of the Global setting
– Mrinal Kamboj
Sep 28 '16 at 5:30
Do you want to opt out for specific properties, or for specific enums?
– dbc
Sep 28 '16 at 5:49
@dcb For specific properties, probably by using an attribute.
– orad
Sep 28 '16 at 5:55
Ideally you shall only decorate the required
properties instead of the Global setting– Mrinal Kamboj
Sep 28 '16 at 5:30
Ideally you shall only decorate the required
properties instead of the Global setting– Mrinal Kamboj
Sep 28 '16 at 5:30
Do you want to opt out for specific properties, or for specific enums?
– dbc
Sep 28 '16 at 5:49
Do you want to opt out for specific properties, or for specific enums?
– dbc
Sep 28 '16 at 5:49
@dcb For specific properties, probably by using an attribute.
– orad
Sep 28 '16 at 5:55
@dcb For specific properties, probably by using an attribute.
– orad
Sep 28 '16 at 5:55
add a comment |
1 Answer
1
active
oldest
votes
up vote
3
down vote
accepted
You could add a dummy converter to the properties in question that does nothing:
public class NoConverter : JsonConverter
public override bool CanConvert(Type objectType)
// Note - not called when attached directly via [JsonConverter(typeof(NoConverter))]
throw new NotImplementedException();
public override bool CanRead get return false;
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
throw new NotImplementedException();
public override bool CanWrite get return false;
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();
Then attach it to the property using [JsonConverter(typeof(NoConverter))]. Having done so, the JsonConverter attribute's converter supersedes the globally specified converter, but since CanRead and CanWrite both return false no conversion is performed. For collections of enums, you could use [JsonProperty(ItemConverterType = typeof(NoConverter))].
For instance, if you define the types:
public enum Foo A, B, C
public class RootObject
[JsonConverter(typeof(NoConverter))]
public Foo FooAsInteger get; set;
public Foo FooAsString get; set;
Then
var root = new RootObject FooAsInteger = Foo.B, FooAsString = Foo.B ;
var json = JsonConvert.SerializeObject(root, Formatting.Indented, new StringEnumConverter());
Console.WriteLine(json);
Produces the output
"FooAsInteger": 1,
"FooAsString": "B"
Note that you can also apply NoConverter directly to the enum, if you want all occurrences of the enum in all data models to be serialized as an integer:
[JsonConverter(typeof(NoConverter))]
public enum FooAlwaysAsInteger A, B, C
Sample fiddle.
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
3
down vote
accepted
You could add a dummy converter to the properties in question that does nothing:
public class NoConverter : JsonConverter
public override bool CanConvert(Type objectType)
// Note - not called when attached directly via [JsonConverter(typeof(NoConverter))]
throw new NotImplementedException();
public override bool CanRead get return false;
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
throw new NotImplementedException();
public override bool CanWrite get return false;
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();
Then attach it to the property using [JsonConverter(typeof(NoConverter))]. Having done so, the JsonConverter attribute's converter supersedes the globally specified converter, but since CanRead and CanWrite both return false no conversion is performed. For collections of enums, you could use [JsonProperty(ItemConverterType = typeof(NoConverter))].
For instance, if you define the types:
public enum Foo A, B, C
public class RootObject
[JsonConverter(typeof(NoConverter))]
public Foo FooAsInteger get; set;
public Foo FooAsString get; set;
Then
var root = new RootObject FooAsInteger = Foo.B, FooAsString = Foo.B ;
var json = JsonConvert.SerializeObject(root, Formatting.Indented, new StringEnumConverter());
Console.WriteLine(json);
Produces the output
"FooAsInteger": 1,
"FooAsString": "B"
Note that you can also apply NoConverter directly to the enum, if you want all occurrences of the enum in all data models to be serialized as an integer:
[JsonConverter(typeof(NoConverter))]
public enum FooAlwaysAsInteger A, B, C
Sample fiddle.
add a comment |
up vote
3
down vote
accepted
You could add a dummy converter to the properties in question that does nothing:
public class NoConverter : JsonConverter
public override bool CanConvert(Type objectType)
// Note - not called when attached directly via [JsonConverter(typeof(NoConverter))]
throw new NotImplementedException();
public override bool CanRead get return false;
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
throw new NotImplementedException();
public override bool CanWrite get return false;
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();
Then attach it to the property using [JsonConverter(typeof(NoConverter))]. Having done so, the JsonConverter attribute's converter supersedes the globally specified converter, but since CanRead and CanWrite both return false no conversion is performed. For collections of enums, you could use [JsonProperty(ItemConverterType = typeof(NoConverter))].
For instance, if you define the types:
public enum Foo A, B, C
public class RootObject
[JsonConverter(typeof(NoConverter))]
public Foo FooAsInteger get; set;
public Foo FooAsString get; set;
Then
var root = new RootObject FooAsInteger = Foo.B, FooAsString = Foo.B ;
var json = JsonConvert.SerializeObject(root, Formatting.Indented, new StringEnumConverter());
Console.WriteLine(json);
Produces the output
"FooAsInteger": 1,
"FooAsString": "B"
Note that you can also apply NoConverter directly to the enum, if you want all occurrences of the enum in all data models to be serialized as an integer:
[JsonConverter(typeof(NoConverter))]
public enum FooAlwaysAsInteger A, B, C
Sample fiddle.
add a comment |
up vote
3
down vote
accepted
up vote
3
down vote
accepted
You could add a dummy converter to the properties in question that does nothing:
public class NoConverter : JsonConverter
public override bool CanConvert(Type objectType)
// Note - not called when attached directly via [JsonConverter(typeof(NoConverter))]
throw new NotImplementedException();
public override bool CanRead get return false;
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
throw new NotImplementedException();
public override bool CanWrite get return false;
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();
Then attach it to the property using [JsonConverter(typeof(NoConverter))]. Having done so, the JsonConverter attribute's converter supersedes the globally specified converter, but since CanRead and CanWrite both return false no conversion is performed. For collections of enums, you could use [JsonProperty(ItemConverterType = typeof(NoConverter))].
For instance, if you define the types:
public enum Foo A, B, C
public class RootObject
[JsonConverter(typeof(NoConverter))]
public Foo FooAsInteger get; set;
public Foo FooAsString get; set;
Then
var root = new RootObject FooAsInteger = Foo.B, FooAsString = Foo.B ;
var json = JsonConvert.SerializeObject(root, Formatting.Indented, new StringEnumConverter());
Console.WriteLine(json);
Produces the output
"FooAsInteger": 1,
"FooAsString": "B"
Note that you can also apply NoConverter directly to the enum, if you want all occurrences of the enum in all data models to be serialized as an integer:
[JsonConverter(typeof(NoConverter))]
public enum FooAlwaysAsInteger A, B, C
Sample fiddle.
You could add a dummy converter to the properties in question that does nothing:
public class NoConverter : JsonConverter
public override bool CanConvert(Type objectType)
// Note - not called when attached directly via [JsonConverter(typeof(NoConverter))]
throw new NotImplementedException();
public override bool CanRead get return false;
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
throw new NotImplementedException();
public override bool CanWrite get return false;
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();
Then attach it to the property using [JsonConverter(typeof(NoConverter))]. Having done so, the JsonConverter attribute's converter supersedes the globally specified converter, but since CanRead and CanWrite both return false no conversion is performed. For collections of enums, you could use [JsonProperty(ItemConverterType = typeof(NoConverter))].
For instance, if you define the types:
public enum Foo A, B, C
public class RootObject
[JsonConverter(typeof(NoConverter))]
public Foo FooAsInteger get; set;
public Foo FooAsString get; set;
Then
var root = new RootObject FooAsInteger = Foo.B, FooAsString = Foo.B ;
var json = JsonConvert.SerializeObject(root, Formatting.Indented, new StringEnumConverter());
Console.WriteLine(json);
Produces the output
"FooAsInteger": 1,
"FooAsString": "B"
Note that you can also apply NoConverter directly to the enum, if you want all occurrences of the enum in all data models to be serialized as an integer:
[JsonConverter(typeof(NoConverter))]
public enum FooAlwaysAsInteger A, B, C
Sample fiddle.
edited Nov 9 at 23:18
answered Sep 28 '16 at 6:00
dbc
52.3k765116
52.3k765116
add a comment |
add a comment |
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f39738714%2fselectively-use-default-json-converter%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Ideally you shall only decorate the required
propertiesinstead of the Global setting– Mrinal Kamboj
Sep 28 '16 at 5:30
Do you want to opt out for specific properties, or for specific enums?
– dbc
Sep 28 '16 at 5:49
@dcb For specific properties, probably by using an attribute.
– orad
Sep 28 '16 at 5:55