我想使用json.net来序列化jquery ui小部件的选项,例如jquery手风琴。
但是手风琴的属性有效,可以是以下之一:
基于整数0,定义了一个活动选项卡,
布尔值,当设置为false时,将折叠所有手风琴。
我正在考虑创建2个可以为空的.NET属性:
int? Active
bool? IsActive
如果Active不为null,则应将其序列化为具有属性名称活动的整数, 如果IsActive不为null,则应将其序列化为具有相同名称活动的布尔值。 .Net代码将确保其中只有一个不能为空。
但是当我把[JsonProperty(“active”)]放在两个属性上时,它不起作用......任何替代方案?
答案 0 :(得分:0)
您当前的方法存在的困难是,这两个字段无法正常工作,因为您无法将它们标记为[JsonProperty("active")]
。我的第一次尝试是按如下方式定义类:
class Accordion
{
[JsonProperty("active")]
[JsonConverter(typeof(ActiveTabConverter))]
public int Active { get; set; }
[JsonProperty("active")]
[JsonConverter(typeof(ActiveTabConverter))]
public bool IsActive { get; set; }
}
导致异常(我假设你也有这个异常),因为我在两个属性上使用了[JsonProperty("active")]
。删除其中一个属性也不起作用:没有异常,但删除了属性的字段从未反序列化。
以下是什么工作:
class Accordion
{
[JsonProperty("active")]
[JsonConverter(typeof(ActiveTabConverter))]
public int Active { get; set; }
[JsonIgnore]
public bool IsActive
{
get
{
return this.Active > -1;
}
}
public Accordion()
{
this.Active = -1;
}
}
请注意,仍有两个字段,但只有一个字段将被反序列化。 IsActive
是一个帮助属性。我在这里遵循的惯例是Active
大于0的值表示开放的折叠选项卡,而-1相当于从JSON接收false
。
class ActiveTabConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(int) || objectType == typeof(bool);
}
public override object ReadJson(JsonReader reader, Type objectType,
JsonSerializer serializer)
{
var value = JValue.ReadFrom(reader);
if (value.Type == JTokenType.Integer)
{
return serializer.Deserialize<int>(reader);
}
return -1;
}
public override void WriteJson(JsonWriter writer, object value,
JsonSerializer serializer)
{
int item = (int)value;
if (item == -1)
{
writer.WriteValue(false);
}
else
{
writer.WriteValue(item);
}
writer.Flush();
}
}
此类负责反序列化和序列化Active
值。
我使用以下代码来序列化/反序列化。请注意,JSON实际上来自jQuery手风琴。对于有问题的一个属性来说,这样做有点过分,但我认为最好使用真实数据。
string json1 = "{\"disabled\":false,\"create\":null,\"active\":2,\"animate\":300,\"collapsible\":false,\"event\":\"click\",\"header\":\"> li > :first-child,> :not(li):even\",\"heightStyle\":\"auto\",\"icons\":{\"activeHeader\":\"ui-icon-triangle-1-s\",\"header\":\"ui-icon-triangle-1-e\",\"headerSelected\":\"ui-icon-triangle-1-s\"},\"activate\":null,\"beforeActivate\":null,\"navigation\":false,\"autoHeight\":true,\"clearStyle\":false,\"fillSpace\":false,\"change\":null,\"changestart\":null,\"animated\":\"slide\"}";
string json2 = "{\"disabled\":false,\"create\":null,\"active\":false,\"animate\":300,\"collapsible\":true,\"event\":\"click\",\"header\":\"> li > :first-child,> :not(li):even\",\"heightStyle\":\"auto\",\"icons\":{\"activeHeader\":\"ui-icon-triangle-1-s\",\"header\":\"ui-icon-triangle-1-e\",\"headerSelected\":\"ui-icon-triangle-1-s\"},\"activate\":null,\"beforeActivate\":null,\"navigation\":false,\"autoHeight\":true,\"clearStyle\":false,\"fillSpace\":false,\"change\":null,\"changestart\":null,\"animated\":\"slide\"}";
Accordion accordion = JsonConvert.DeserializeObject<Accordion>(json1);
string serializedJson = JsonConvert.SerializeObject(accordion);
accordion = JsonConvert.DeserializeObject<Accordion>(json2);
serializedJson = JsonConvert.SerializeObject(accordion);