C# 如何序列化列表<;(字符串,字符串,字符串)>;使用C中的System.Text.Json#
我第一次尝试使用将被序列化为JSON的数据类来生成报告,而不是手动生成报告。我的数据的核心是这样声明的列表C# 如何序列化列表<;(字符串,字符串,字符串)>;使用C中的System.Text.Json#,c#,serialization,system.text.json,C#,Serialization,System.text.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.
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
"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"
}
},
....
public List 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);
}
元组的工作方式类似于字段(而不是属性)。默认情况下,序列化程序将忽略字段
您需要启用:
private static void Serialize(资产资产,JsonSerializerOptions?选项=null)
{
var json=JsonSerializer.Serialize(
资产,
选项??新JsonSerializerOptions{
WriteIndended=true,
IgnoreNullValues=true,
includefelds=true
}
);
Console.WriteLine(json);
}
元组的工作方式类似于字段(而不是属性)。默认情况下,序列化程序将忽略字段
您需要启用:
private static void Serialize(资产资产,JsonSerializerOptions?选项=null)
{
var json=JsonSerializer.Serialize(
资产,
选项??新JsonSerializerOptions{
WriteIndended=true,
IgnoreNullValues=true,
includefelds=true
}
);
Console.WriteLine(json);
}
解决方案是创建一个自定义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();
}
}
它可能还有改进的余地,但现在我知道如何在将来做到这一点。解决方案是创建一个定制的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();
}
}
它可能有改进的余地,但现在我知道如何在将来做到这一点。请分享一个。用代码填充数据。做正确的事。你不能用那个吗?请分享一个。用代码填充数据。做正确的事。你不能用它吗?我确实试过,但我知道“JsonSerializerOptions”不包含“IncludeFields”的定义。我想手动定义哪些字段将被序列化。我使用的是Sytem.Text.Json 5.0.0。经过一些研究,我发现.NET Core 3.1中的System.Text.Json不支持包含字段。自定义转换器可以提供此功能。您的目标是什么?.NET Core 3.1,我应该提到。我确实尝试过,但我发现“JsonSerializerOptions”不包含“IncludeFields”的定义。我想手动定义哪些字段将被序列化。我使用的是Sytem.Text.Json 5.0.0。经过一些研究,我发现.NET Core 3.1中的System.Text.Json不支持包含字段。自定义转换器可以提供此功能。您的目标是.NET?我应该提到.NET Core 3.1。