簡體   English   中英

在json中將類的字節數組屬性序列化為布爾值

[英]Serialize byte array property of class as boolean in json

我有以下課程

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

我想將JSON中的Logo屬性序列化為布爾值:如果Logo與null不同,則為true,否則為false。 如何使用JsonProperty裝飾器?

如果使用以下JsonConverter類,它將序列化所需的方式。 我沒有實現ReadJson (反序列化),因為數據不再存在。 我敢肯定,還有其他方法可以實現此目的,但是我只是簡單地序列化了帶有正確數據的匿名對象。 最初,我嘗試為byte[]寫一個轉換器,但Json.NET顯然甚至沒有嘗試將轉換器用於null值,因此它會給出nulltrue ,而不是falsetrue

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; }
}

輸出類似:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM