私のクラスをJSONに変換する必要があり、Json.NETを使用します。しかし、私のようなさまざまなJSON構造を持つことができます。Json.NETのenson値に基づく異なるjson構造
{
name: "Name",
type: "simple1",
value: 100
};
または
{
name: "Name",
type: {
optional1: {
setting1: "s1",
setting2: "s2",
///etc.
},
value: 100
};
私のC#コードは次のとおりです。Configuration.Type
とき
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
}
私の考えだった - 値がOptionalSettingsAttribute
属性いません - type: "simple1"
としてシリアル化します。そうでない場合 - Configuration.Type
- 型の値のキー(type: { optional1: {} }
)の値とConfiguration.TypeAdditionalData
の値をoptional1
- 値(上記の2つの単純なJSONのような値)として使用します。
私は次のように、カスタムコンバータを作成しようとしました:私はConfiguration
クラスに[JsonConverter(typeof(ConfigurationCustomConverter))]
属性を追加するとき
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);
}
しかし:
[JsonConverter(typeof(ConfigurationCustomConverter))]
public class Configuration
とJsonConvert.SerializeObject(configurationObj);
と呼ばれる、私は次のエラーを受け取りました:
Self referencing loop detected with type 'Configuration'. Path ''.
変更の方法がありますか? 2つの異なるJSON構造にクラスをシリアル化する私のコードですか? 注:私はJSONを逆シリアル化するために同じクラスを使用しません。
ありがとうございました!
ありがとう@dbcたくさん!私は解決#3を試み、それは私のために働いています! – Pepo