首页 > 解决方案 > 如何在 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

我在 VS 中的列表

标签: c#serializationsystem.text.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();
        }

    }

它导致像这样的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"
      }
    },
....

它可能还有改进的空间,但现在我知道如何为未来做这件事。


推荐阅读