亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在序列化期間忽略我不擁有的子類的屬性?

如何在序列化期間忽略我不擁有的子類的屬性?

C#
一只名叫tom的貓 2022-12-04 13:14:54
我有一個類Tempo。我可以自由改變:public class Tempo{    public Period Period { get; set; }    public int Value { get; set; } // in fact int should be a T here if it matters.    // more properties here}Period是來自我無法更改的外部依賴項的類。public class Period{    public DateTime Start { get; set; }    public DateTime End { get; set; }    public int Count { get; set; }    public string Foo { get; set; }    // more properties here}Period是一個巨大的類,有很多我不想序列化的屬性。所以對我來說沒有甜蜜[JsonIgnore]。從Period我想只保留屬性Start和End。我嘗試使用 aDefaultContractResolver但沒有成功:class TempoResolver : DefaultContractResolver{    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)    {        var props = base.CreateProperties(type, memberSerialization);        return props            .Where(p => p.PropertyName != "Period") // how to filter subclass?            .ToList();    }}我嘗試使用 aJsonConverter但沒有成功:public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer){    var jo = new JObject();    var type = value.GetType();    jo.Add("type", type.Name);    foreach (var prop in type.GetProperties().Where(x => x.CanRead))    {        object propVal = prop.GetValue(value, null);        if (propVal != null)        {            jo.Add(prop.Name,             JToken.FromObject(propVal, serializer));  // how to filter subclass?        }    }    jo.WriteTo(writer);}在這兩種情況下,我都不確定如何過濾Period. 如何在序列化期間忽略我不擁有的子類的屬性?
查看完整描述

3 回答

?
當年話下

TA貢獻1890條經驗 獲得超9個贊

JsonConverter您可以為類創建強類型Period:


public class PeriodConverter : JsonConverter<Period>

{

    public override void WriteJson(JsonWriter writer, Period period, JsonSerializer serializer)

    {

        writer.WriteStartObject();

        writer.WritePropertyName(nameof(Period.Start));

        writer.WriteValue(period.Start);

        writer.WritePropertyName(nameof(Period.End));

        writer.WriteValue(period.End);

        writer.WriteEndObject();

    }


    public override Period ReadJson(JsonReader reader, Type objectType, Period existingValue, bool hasExistingValue,

        JsonSerializer serializer)

    {

        throw new NotSupportedException();

    }

}

用法:


var tempo = new Tempo

{

    Period = new Period

    {

        Start = DateTime.Now.AddDays(-1),

        End = DateTime.Now.AddHours(-1),

        Count = 42,

        Foo = "Foo"

    },

    Value = 42

};


var result = JsonConvert.SerializeObject(tempo, new PeriodConverter());

var regularJson = JsonConvert.SerializeObject(tempo);

regularJson將具有以下所有屬性Period:


{"期間":{"開始":"2019-04-08T12:21:39.1525361+03:00","結束":"2019-04-09T11:21:39.1535328+03:00","計數": 42,“富”:“富”},“值”:42}


并且result只期望:


{"期間":{"開始":"2019-04-08T12:21:39.1525361+03:00","結束":"2019-04-09T11:21:39.1535328+03:00"},"值" :42}


更新


WriteJson可以使用匿名對象簡化代碼:


public override void WriteJson(JsonWriter writer, Period period, JsonSerializer serializer)

{

    var token = JToken.FromObject(new {Start = period.Start, End = period.End});

    token.WriteTo(writer);

}


查看完整回答
反對 回復 2022-12-04
?
慕斯王

TA貢獻1864條經驗 獲得超2個贊

制作子類:


public class Periodic

{

    public DateTime Start { get; set; }

    public DateTime End { get; set; }

}

使用帶有此代碼的自定義轉換器:


public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)

{

    Periodic periodic = (Periodic)value;

    JToken t = JToken.FromObject(periodic);

    t.WriteTo(writer);

}


查看完整回答
反對 回復 2022-12-04
?
斯蒂芬大帝

TA貢獻1827條經驗 獲得超8個贊

一種解決方案是使用以下子集Period:


// your external dependency

public class Period

{

    public DateTime Start { get; set; }

    public DateTime End { get; set; }

    public int Count { get; set; }

    public string Foo { get; set; }

}


// your copycat with only the properties you really need

public class Periodic

{

    public DateTime Start { get; set; }

    public DateTime End { get; set; }

}


public class Tempo

{

    public Periodic Period { get; set; }

    public int Value { get; set; }

}


public static void Main()

{

    var period = new Period{Count = 1, Foo = "bar", Start = DateTime.Now, End = DateTime.Now.AddDays(1)};

    var tempo = new Tempo{Value = 1, Period = new Periodic {Start = period.Start, End = period.End} };


    Console.WriteLine(JsonConvert.SerializeObject(tempo));

}

您還可以使用像Automapper這樣的庫來處理外部類和模仿者之間的映射。對于兩個屬性,它可能有點矯枉過正。



查看完整回答
反對 回復 2022-12-04
  • 3 回答
  • 0 關注
  • 154 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號