gpt4 book ai didi

c# - 在 WebAPI 中获取 JSON.NET 以序列化确切类型而不是子类

转载 作者:太空狗 更新时间:2023-10-29 23:45:28 28 4
gpt4 key购买 nike

我在一个域中有三个类

public class ArtistInfo
{
private Guid Id { get; set; }
public string Name { get; set; }
public string DisplayName { get; set; }
public bool IsGroup { get; set; }
public bool IsActive { get; set; }
public string Country { get; set; }
}

public class Artist : ArtistInfo
{
public DateTime Created { get; set; }
public int CreatedById { get; set; }
public DateTime Updated { get; set; }
public int UpdatedById { get; set; }
}

public class Track
{
public string Title { get; set; }
public string DisplayTitle { get; set; }
public int Year { get; set; }
public int Duration { get; set; }
public int? TrackNumber { get; set; }
//[SomeJsonAttribute]
public ArtistInfo Artist { get; set; }
}

我从 ASP.NET Web API 返回一个通用列表(轨道)。无论我尝试过什么,Web API 都会将 Track 的 Artist 属性作为艺术家而不是 ArtistInfo 返回。有什么方法可以限制 API 的输出只使用 ArtistInfo 吗?我不想编写额外的“ViewModels/DTO”来处理这种情况。我可以用对 JSON 序列化程序的提示来修饰 ArtistInfo 吗?

最佳答案

获得所需结果的一种方法是使用可以限制序列化属性集的自定义 JsonConverter。这是一个只会序列化基本类型 T 的属性的例子:

public class BaseTypeConverter<T> : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(T).IsAssignableFrom(objectType);
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
JObject obj = new JObject();
foreach (PropertyInfo prop in typeof(T).GetProperties())
{
if (prop.CanRead)
{
obj.Add(prop.Name, JToken.FromObject(prop.GetValue(value)));
}
}
obj.WriteTo(writer);
}

public override bool CanRead
{
get { return false; }
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}

要使用转换器,请使用 [JsonConverter] 属性标记 Track 类中的 Artist 属性,如下所示。然后,只有 ArtistArtistInfo 属性会被序列化。

public class Track
{
public string Title { get; set; }
public string DisplayTitle { get; set; }
public int Year { get; set; }
public int Duration { get; set; }
public int? TrackNumber { get; set; }
[JsonConverter(typeof(BaseTypeConverter<ArtistInfo>))]
public ArtistInfo Artist { get; set; }
}

Demo here

关于c# - 在 WebAPI 中获取 JSON.NET 以序列化确切类型而不是子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25454568/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com