c# - 如何在 C# 中使用 System.Text.Json 序列化 List<(string,string,string)>
问题描述
我第一次尝试使用将序列化为 JSON 的数据类而不是手动进行报告。我的数据的核心是这样声明的列表
public List<(string oid,string data,string desc)> assetData { get; set; }
我的序列化功能是
private static void Serialize(Asset asset, JsonSerializerOptions? options = null)
{
var json = JsonSerializer.Serialize<Asset>(
asset,
options ?? new JsonSerializerOptions() {
WriteIndented = true,
IgnoreNullValues = true,
});
Console.WriteLine(json);
}
Json 序列化程序只会给我每一行的空 {},我如何制作它以便它以有序的方式给我字段的名称和数据?
我的数据看起来像这样
OID= 1.3.6.1.2.1.1.1.0 Translation= BGP4-V2-MIB::bgpM2BaseNotifications Data=
OID= 1.3.6.1.2.1.1.2.0 Translation= CABH-IETF-CAP-MIB::cabhCapNotification Data= 1.3.6.1.4.1.8691.10.2210
OID= 1.3.6.1.2.1.1.3.0 Translation= DISMAN-EVENT-MIB::sysUpTimeInstance Data= 01:39:31.4500000
OID= 1.3.6.1.2.1.1.4.0 Translation= SNMPv2-MIB::sysContact.0 Data=
OID= 1.3.6.1.2.1.1.5.0 Translation= SNMPv2-MIB::sysName.0 Data= E2210_6115
OID= 1.3.6.1.2.1.1.6.0 Translation= SNMPv2-MIB::sysLocation.0 Data=
OID= 1.3.6.1.2.1.1.7.0 Translation= SNMPv2-MIB::sysServices.0 Data= 72
OID= 1.3.6.1.2.1.2.1.0 Translation= RFC-1213-MIB::ifNumber.0 Data= 2
OID= 1.3.6.1.2.1.2.2.1.1.1 Translation= RFC-1213-MIB::ifIndex.1 Data= 1
OID= 1.3.6.1.2.1.2.2.1.1.2 Translation= RFC-1213-MIB::ifIndex.2 Data= 2
OID= 1.3.6.1.2.1.2.2.1.2.1 Translation= RFC-1213-MIB::ifDescr.1 Data= Moxa Ethernet port 01
OID= 1.3.6.1.2.1.2.2.1.2.2 Translation= RFC-1213-MIB::ifDescr.2 Data= Moxa serial port 01
解决方案
对此的解决方案是制作一个自定义的 JsonConverter 类。
public class ListConverter : JsonConverter<List<(string,string,string)>>
{
public override List<(string, string, string)> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
throw new NotImplementedException();
}
public override void Write(Utf8JsonWriter writer, List<(string, string, string)> value, JsonSerializerOptions options)
{
writer.WriteStartArray("dataArray");
foreach (var line in value)
{
writer.WriteStartObject();
writer.WriteStartObject("Oid");
writer.WriteStringValue(line.Item1);
writer.WriteEndObject();
writer.WriteStartObject("Data");
writer.WriteStringValue(line.Item2);
writer.WriteEndObject();
writer.WriteStartObject("Desc");
writer.WriteStringValue(line.Item3);
writer.WriteEndObject();
writer.WriteEndObject();
}
writer.WriteEndArray();
}
}
它导致像这样的JSON
"dataArray": [
{
"Oid": {
"1.3.6.1.2.1.1.1.0"
},
"Data": {
""
},
"Desc": {
"BGP4-V2-MIB::bgpM2BaseNotifications"
}
},
{
"Oid": {
"1.3.6.1.2.1.1.2.0"
},
"Data": {
"1.3.6.1.4.1.8691.10.2210"
},
"Desc": {
"CABH-IETF-CAP-MIB::cabhCapNotification"
}
},
{
"Oid": {
"1.3.6.1.2.1.1.3.0"
},
"Data": {
"05:42:39.6300000"
},
"Desc": {
"DISMAN-EVENT-MIB::sysUpTimeInstance"
}
},
{
"Oid": {
"1.3.6.1.2.1.1.4.0"
},
"Data": {
""
},
"Desc": {
"SNMPv2-MIB::sysContact.0"
}
},
{
"Oid": {
"1.3.6.1.2.1.1.5.0"
},
"Data": {
"E2210_6115"
},
"Desc": {
"SNMPv2-MIB::sysName.0"
}
},
....
它可能还有改进的空间,但现在我知道如何为未来做这件事。
推荐阅读
- docker - 在不知道主机操作系统的情况下访问主机上的 Docker 守护进程
- vba - 哪个运算符不正确并返回错误“3075”?
- javascript - React slick 在 div 里面给出空白背景图像
- javascript - html 页面是从磁盘缓存加载的,但 event.persisted 为 false
- python - Keras in_top_k 损失
- python - 访问一个标签内的多个标签
- macos - Automator AppleScript 日志不起作用。我做错了什么?
- regex - 带后缀的可选命名捕获组
- datetime - 试图在颤动中将时间戳从 twitter api 转换为 DateTime
- python - Dash:如何通过 CSS 控制图形样式?