我有以下课程
public class MyClass
{
public int Id { get; set; }
public byte[] Logo { get; set; }
}
我想将json中的Logo属性序列化为boolean:如果Logo不是null,则为true,否则为false。我怎样才能使用JsonProperty装饰器?
答案 0 :(得分:1)
如果您使用以下JsonConverter
课程,它将按您的方式序列化。我还没有实现ReadJson
(反序列化),因为数据不再存在。还有其他方法可以实现这一点,我确定,但我只是使用正确的数据序列化了一个匿名对象。起初,我试图为byte[]
编写一个转换器,但是Json.NET显然甚至没有尝试将转换器用于null
值,因此它会给{{1} }或null
,而不是true
或false
。
true
将其指定为类的转换器:
public class MyClassConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(MyClass) == objectType;
}
public override object ReadJson(JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value,
JsonSerializer serializer)
{
var myClass = (MyClass)value;
serializer.Serialize(writer, new { Id = myClass.Id,
Logo = myClass.Logo != null });
}
}
或者在您进行序列化时指定它(如果您无法修改[JsonConverter(typeof(MyClassConverter))]
public class MyClass
{
public int Id { get; set; }
public byte[] Logo { get; set; }
}
,我建议您这样做,或者有时只想将其序列化):
MyClass
这是另一种方法。如果你能添加一个属性并且能够修改var s1 = JsonConvert.SerializeObject(new MyClass(), new MyClassConverter());
var s2 = JsonConvert.SerializeObject(new MyClass
{ Id = 1, Logo = new byte[] { 1, 2, 3, } }, new MyClassConverter());
,我更喜欢这个:
MyClass
输出类似:
public class MyClass
{
public int Id { get; set; }
[JsonProperty("Logo")]
public bool HasLogo { get { return Logo != null; } }
[JsonIgnore]
public byte[] Logo { get; set; }
}