Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在json中将类的字节数组属性序列化为布尔值_C#_Json_Serialization - Fatal编程技术网

C# 在json中将类的字节数组属性序列化为布尔值

C# 在json中将类的字节数组属性序列化为布尔值,c#,json,serialization,C#,Json,Serialization,我有以下课程 public class MyClass { public int Id { get; set; } public byte[] Logo { get; set; } } 我想将json中的Logo属性序列化为boolean:如果Logo不同于null,则为true,否则为false。如何使用JsonProperty decorator?如果使用以下JsonConverter类,它将按照您的需要序列化。我没有实现ReadJson(反

我有以下课程

public class MyClass
{
     public int Id { get; set; }           
     public byte[] Logo { get; set; }   
}

我想将json中的Logo属性序列化为boolean:如果Logo不同于null,则为true,否则为false。如何使用JsonProperty decorator?

如果使用以下
JsonConverter
类,它将按照您的需要序列化。我没有实现
ReadJson
(反序列化),因为数据不再存在。我确信还有其他方法可以实现这一点,但我只是用正确的数据序列化了一个匿名对象。起初,我试图为
byte[]
编写一个转换器,但Json.NET显然甚至没有尝试将转换器用于
null
值,因此它会给出
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
,或者只是有时候想这样序列化,我建议您这样做):


这里有另一种方法。如果您可以添加属性并能够修改
MyClass
,我更希望这样:

public class MyClass
{
     public int Id { get; set; }
     [JsonProperty("Logo")]
     public bool HasLogo { get { return Logo != null; } }
     [JsonIgnore]
     public byte[] Logo { get; set; }
}
输出类似于:

{"Id":0,"Logo":false} // or
{"Id":1,"Logo":true}

我更喜欢不添加额外属性的解决方案,但是如果你说它不能做其他事情,我会接受你的回答best@fabinho应该可以使用自定义的
JsonConverter
在没有额外属性的情况下执行此操作。我看看是否可以添加一个示例。@fabinho我已经添加了示例。
{"Id":0,"Logo":false} // or
{"Id":1,"Logo":true}