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

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

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這樣的庫來處理外部類和模仿者之間的映射。對于兩個屬性,它可能有點矯枉過正。
- 3 回答
- 0 關注
- 154 瀏覽
添加回答
舉報