I need to convert my class to JSON and I use Json.NET. But I can have different JSON structures, like:
{
name: "Name",
type: "simple1",
value: 100
};
or
{
name: "Name",
type: {
optional1: {
setting1: "s1",
setting2: "s2",
///etc.
},
value: 100
};
My C# code is:
public class Configuration
{
[JsonProperty(PropertyName = "name")]
public string Name{ get; set; }
[JsonProperty(PropertyName = "type")]
public MyEnumTypes Type { get; set; }
public OptionalType TypeAdditionalData { get; set; }
[JsonProperty(PropertyName = "value")]
public int Value { get; set; }
public bool ShouldSerializeType()
{
OptionalSettingsAttribute optionalSettingsAttr = this.Type.GetAttributeOfType<OptionalSettingsAttribute>();
return optionalSettingsAttr == null;
}
public bool ShouldSerializeTypeAdditionalData()
{
OptionalSettingsAttribute optionalSettingsAttr = this.Type.GetAttributeOfType<OptionalSettingsAttribute>();
return optionalSettingsAttr != null;
}
}
public enum MyEnumTypes
{
[EnumMember(Value = "simple1")]
Simple1,
[EnumMember(Value = "simple2")]
Simple2,
[OptionalSettingsAttribute]
[EnumMember(Value = "optional1")]
Optional1,
[EnumMember(Value = "optional2")]
[OptionalSettingsAttribute]
Optional2
}
My idea was when Configuration.Type
- value hasn't attribute OptionalSettingsAttribute
- to serialize it as type: "simple1"
. Otherwise - to use Configuration.Type
- value as type's value key (type: { optional1: {} }
) and value in Configuration.TypeAdditionalData
as optional1
- value (like 2 simple JSON above).
I tried to create a custom Converter, like:
public class ConfigurationCustomConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(Configuration).IsAssignableFrom(objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return serializer.Deserialize<Configuration>(reader);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
//my changes here
serializer.Serialize(writer, value);
}
But when I add [JsonConverter(typeof(ConfigurationCustomConverter))]
attribute to Configuration
class:
[JsonConverter(typeof(ConfigurationCustomConverter))]
public class Configuration
and called JsonConvert.SerializeObject(configurationObj);
I received next error:
Self referencing loop detected with type 'Configuration'. Path ''.
Do you have any ideas how to change my code to serialize my class to 2 different JSON structures? Note: I won't use the same class to deserialize the JSON.
Thank you!