繁体   English   中英

如何覆盖属性的 JSON 序列化,以将值序列化为字符串而不是 object?

[英]How can I override the JSON serialization for a property, to serialize the value as a string instead of an object?

使用.Net 4.8,我的所有实体框架类都继承自 AbstractBase:

public abstract class AbstractBase
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual int Id { get; set; }

    public virtual DateTime CreatedTimestamp { get; set; }

    public virtual DateTime UpdatedTimestamp { get; set; }

    [Required]
    public virtual int CreatedBy { get; set; }

    [Required]
    public virtual int LastModifiedBy { get; set; }

    public virtual bool ActiveFlag { get; set; }

    [JsonIgnore]
    public virtual User CreatedByUser { get; set; }

    [JsonIgnore]
    public virtual User LastModifiedByUser { get; set; }

    public string ToActiveInactive()
    {
        return this.ActiveFlag ? "Active" : "Inactive";
    }
}

现在你可以看到我忽略了CreatedByUserLastModifiedByUser 我想做的是以某种方式将用户 object 替换为用户 object 可以提供的名为 FullName 的属性,例如

User test = new User();
test.GetFullName();

我的用户 object 已经有了这个,所以我的问题是有没有办法做到这一点,所以每次我想序列化一个实体 class 时,我不必编写更多相同逻辑的实现?

您可以创建一个自定义JsonConverter<T> ,如Newtonsoft 文档中所示,将您的User class 序列化为字符串:

public class UserConverter : JsonConverter<User>
{
    public override void WriteJson(JsonWriter writer, User value, JsonSerializer serializer)
    {
        writer.WriteValue(value.GetFullName());
    }

    public override User ReadJson(JsonReader reader, Type objectType, User existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        var fullName = serializer.Deserialize<string>(reader);
        // Or construct a User and return it, if you can do so from the fullName.
        throw new NotImplementedException();
    }
}

请注意,您的问题没有为我提供足够的信息来编写ReadJson()方法。 如果您需要支持反序列化,则需要通过从fullName字符串构造一个User来完全实现此方法。

现在,要使用转换器,您有几个选择:

  1. 如果您只想将AbstractBaseUser属性序列化为字符串,请使用JsonConverterAttribute将转换器应用于User属性,如下所示:

     public abstract class AbstractBase { [JsonConverter(typeof(UserConverter))] public virtual User CreatedByUser { get; set; } [JsonConverter(typeof(UserConverter))] public virtual User LastModifiedByUser { get; set; } // Remaining properties and methods unchanged
  2. 如果您希望将User的所有实例序列化为字符串,则可以将其直接应用于User ,如下所示:

     [JsonConverter(typeof(UserConverter))] public class User { // Properties and methods unchanged
  3. 或者,您可以将其添加到您的全局JsonSerializerSettings.Converters中。 要在 .NET 框架中执行此操作,请参阅AndreiJson.net 全局设置回答 对于 .NET Core 2.x,请参阅 Métoule 在ASP.NET Core MVC 中自定义响应序列化的答案

  4. .NET Core 3.x and later use a difference serializer, , so you will have to use a different approach in that version, or revert back to using Json.NET as shown in Where did IMvcBuilder AddJsonOptions go in.Net Core 3.0 ? .

演示小提琴在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM