Ich muss meine Klasse zu JSON konvertieren und ich verwende Json.NET. Aber ich kann verschiedene JSON Strukturen haben, wie:Json.NET andere JSON-Struktur, basierend auf Enum-Wert
{
name: "Name",
type: "simple1",
value: 100
};
oder
{
name: "Name",
type: {
optional1: {
setting1: "s1",
setting2: "s2",
///etc.
},
value: 100
};
Mein C# -Code ist:
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
}
Meine Idee war es, wenn Configuration.Type
- Wert nicht OptionalSettingsAttribute
Attribut - um es als type: "simple1"
zu serialisieren. Ansonsten - um Configuration.Type
zu verwenden - Wert als Wertschlüssel des Typs (type: { optional1: {} }
) und Wert in Configuration.TypeAdditionalData
als optional1
- Wert (wie 2 einfache JSON oben).
Ich habe versucht, einen benutzerdefinierten Konverter zu erstellen, wie:
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);
}
Aber wenn ich hinzufügen [JsonConverter(typeof(ConfigurationCustomConverter))]
Attribut Configuration
Klasse:
[JsonConverter(typeof(ConfigurationCustomConverter))]
public class Configuration
und rief JsonConvert.SerializeObject(configurationObj);
ich nächste Fehler empfangen:
Self referencing loop detected with type 'Configuration'. Path ''.
Haben Sie irgendwelche Ideen, wie Sie sich ändern können? mein Code, um meine Klasse in 2 verschiedene JSON-Strukturen zu serialisieren? Hinweis: Ich werde nicht die gleiche Klasse zum Deserialisieren des JSON verwenden.
Vielen Dank!
Vielen Dank @dbc viel! Ich habe Lösung 3 versucht und es funktioniert für mich! – Pepo