【发布时间】:2016-10-20 04:22:59
【问题描述】:
我需要将我的类转换为 JSON,并且我使用 Json.NET。但我可以有不同的 JSON 结构,例如:
{
name: "Name",
type: "simple1",
value: 100
};
或
{
name: "Name",
type: {
optional1: {
setting1: "s1",
setting2: "s2",
///etc.
},
value: 100
};
我的 C# 代码是:
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
}
我的想法是当Configuration.Type - 值没有属性OptionalSettingsAttribute - 将其序列化为type: "simple1"。否则 - 使用 Configuration.Type - 值作为类型的值键 (type: { optional1: {} }) 和 Configuration.TypeAdditionalData 中的值作为 optional1 - 值(如上面的 2 个简单 JSON)。
我尝试创建一个自定义转换器,例如:
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))] 属性添加到Configuration 类时:
[JsonConverter(typeof(ConfigurationCustomConverter))]
public class Configuration
并调用JsonConvert.SerializeObject(configurationObj); 我收到下一个错误:
检测到“配置”类型的自引用循环。路径''。
您知道如何更改我的代码以将我的类序列化为 2 个不同的 JSON 结构吗? 注意:我不会使用同一个类来反序列化 JSON。
谢谢!
【问题讨论】:
标签: c# .net json serialization json.net