首页 > 其他分享 > 『 再看.NET7』让json序列化体现多态

『 再看.NET7』让json序列化体现多态

时间:2023-02-11 15:00:48浏览次数:58  
标签:Customer set string get 多态 NET7 new 序列化 public

  从System.Text.Json诞生,就在努力增加功能和提升性能,在.NET7中,又带来了多态的适配。

  下面是一个父类Customer,两个子类,WechatCustomer和LineCustomer。

public class Customer
{
public string Name { get; set; }
public string Address { get; set; }
public string City { get; set; }
public string Region { get; set; }
public string PostalCode { get; set; }
public string EMail { get; set; }
public string Tel { get; set; }
}

public class WechatCustomer : Customer
{
public string? WechatNo { get; set; }
}
public class LineCustomer : Customer
{
public string? LineNo { get; set; }
}

  分别用一个打印方法PrintCustomer输出两个子类对象。

var wechatCustomer = new WechatCustomer
{
Name = "张三",
City = "东京",
Region = "中央区",
Address = "1-56-326",
PostalCode = "3000235",
EMail = "[email protected]",
Tel = "08-9563-2356",
WechatNo = "wechat_gsw"
};
var lineCustomer = new LineCustomer
{
Name = "张三",
City = "东京",
Region = "中央区",
Address = "1-56-326",
PostalCode = "3000235",
EMail = "[email protected]",
Tel = "08-9563-2356",
LineNo = "line_gsw"
};
//共用打印方法
void PrintCustomer(Customer customer)
{
var options = new JsonSerializerOptions
{
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
WriteIndented = true
};
var json = JsonSerializer.Serialize<Customer>(customer, options);
Console.WriteLine(json);
}

PrintCustomer(wechatCustomer);
PrintCustomer(lineCustomer);

  输出结果是:

{
"Name": "张三",
"Address": "1-56-326",
"City": "东京",
"Region": "中央区",
"PostalCode": "3000235",
"EMail": "[email protected]",
"Tel": "08-9563-2356"
}
{
"Name": "张三",
"Address": "1-56-326",
"City": "东京",
"Region": "中央区",
"PostalCode": "3000235",
"EMail": "[email protected]",
"Tel": "08-9563-2356"
}

  现在丢失了子类的属性WechatNo和LineNo,在.NET7中,可以通过两种方式来保证不丢失这种多态产生的新的属性:特性和自定义类型信息解析器。

  特性:

[JsonPolymorphic(TypeDiscriminatorPropertyName = "CustomerType")]
[JsonDerivedType(typeof(WechatCustomer), typeDiscriminator: "wechatCustomer")]
[JsonDerivedType(typeof(LineCustomer), typeDiscriminator: "lineCustomer")]
public class Customer
{
……
}

  通过给父类Customer添加特性,来达到json化的效果。再次输出如下:

{
"CustomerType": "wechatCustomer",
"WechatNo": "wechat_gsw",
"Name": "张三",
"Address": "1-56-326",
"City": "东京",
"Region": "中央区",
"PostalCode": "3000235",
"EMail": "[email protected]",
"Tel": "08-9563-2356"
}
{
"CustomerType": "lineCustomer",
"LineNo": "line_gsw",
"Name": "张三",
"Address": "1-56-326",
"City": "东京",
"Region": "中央区",
"PostalCode": "3000235",
"EMail": "[email protected]",
"Tel": "08-9563-2356"
}

  可以看到,JsonPolymorphic特性是定义一个标注子类名称的属性customerType,而JsonDerivedType是定义两个子类的特性。

  自定义类型信息解析器:

  首先定义自定义类型信息解析器class,可以看出,他的作用与上面的特性是一样的。

public class PolymorphicTypeResolver : DefaultJsonTypeInfoResolver
{
public override JsonTypeInfo GetTypeInfo(Type type, JsonSerializerOptions options)
{
JsonTypeInfo jsonTypeInfo = base.GetTypeInfo(type, options);

Type basePointType = typeof(Customer);
if (jsonTypeInfo.Type == basePointType)
{
jsonTypeInfo.PolymorphismOptions = new JsonPolymorphismOptions
{
TypeDiscriminatorPropertyName = "CustomerType",
DerivedTypes =
{
new JsonDerivedType(typeof(WechatCustomer), "wechatCustomer"),
new JsonDerivedType(typeof(LineCustomer), "lineCustomer")
}
};
}
return jsonTypeInfo;
}
}

  这个时候,Customer上的特性就可以没有了,只要在PrintCustomer方法中给options加个属性即可。

void PrintCustomer(Customer customer)
{
var options = new JsonSerializerOptions
{
TypeInfoResolver = new PolymorphicTypeResolver(),
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
WriteIndented = true
};
var json = JsonSerializer.Serialize<Customer>(customer, options);
Console.WriteLine(json);
}

  输出结果与特性方式是一样的。这里不再赘述。

  上面两种方式,也可以把对应的json字符串反序列化回来。


  想要更快更方便的了解相关知识,可以关注微信公众号

 『 再看.NET7』让json序列化体现多态_json序列化


标签:Customer,set,string,get,多态,NET7,new,序列化,public
From: https://blog.51cto.com/axzxs/6050692

相关文章

  • java反序列化基础
    前言:最近开始学习java的序列化与反序列化,现在从原生的序列化与反序列化开始,小小的记录一下参考文章:https://blog.csdn.net/mocas_wang/article/details/10762101001.什么......
  • Java - 面向对象 - 多态
    多态多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各......
  • 多态
    多态多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各......
  • Django 含有外键模型新增数据以及序列化
    https://www.cnblogs.com/SunshineKimi/p/14042914.htmlDjango原生实现外键classAppleModel(models.Model):id=models.AutoField(primary_key=True)app_name......
  • 『 再看.NET7』VisualStudio靓点拾遗
    下面汇总了一些VisualStudio“靓点”,有的可能你已经天天在用,用来提升生产力了,不过仍希望本篇对你有所收获。数值类型格式化为了看大数值类型方便,C#可以用下划线来分......
  • 『 再看.NET7』看看required属性有什么不同
    还是先看看C#中属性的这定义,在初始化和访问上有哪些方式,就能看出required属性有什么不一样的地方了。属性,是封装字段的,通过get和set访问器可以很好地验证数据的有效......
  • 『 再看.NET7』数值类型
    在C#中,有int16,用short来定义;有int32,用int定义;用int64,用long来定义。在.NET7中,添加了int128,和unint128,位数更大的整型。vari16=short.MaxValue;Console.WriteLine......
  • 『 再看.NET7』数值类型
    在C#中,有int16,用short来定义;有int32,用int定义;用int64,用long来定义。在.NET7中,添加了int128,和unint128,位数更大的整型。vari16=short.MaxValue;Console.WriteLine......
  • 『 再看.NET7』看看required属性有什么不同
    还是先看看C#中属性的这定义,在初始化和访问上有哪些方式,就能看出required属性有什么不一样的地方了。属性,是封装字段的,通过get和set访问器可以很好地验证数据的有......
  • 『 再看.NET7』看看required属性有什么不同
    还是先看看C#中属性的这定义,在初始化和访问上有哪些方式,就能看出required属性有什么不一样的地方了。属性,是封装字段的,通过get和set访问器可以很好地验证数据的有......