使用 System.Text.Json 序列化为 JSON 时向对象添加根元素

Add a root element to an object while serializing to JSON using System.Text.Json

全部, 执行以下代码时,我们 运行 进入以下异常(粗体),我们试图将根节点“test”添加到最后 json 结果。我们希望在没有匿名对象或包装器的情况下实现这一点 类.

"无法在数组中写入 JSON 属性 或作为第一个 JSON 标记。当前标记类型为 'None'。

 internal static class Program
    {
        public static void Main(string[] args)
        {
            customer cust = new customer();
            cust.firstname = "first";
            cust.lastname = "last";

            Console.WriteLine(AddRootToJson("test", cust));
        }

        public static string AddRootToJson(string root, object obj)
        {
            var msSt = new MemoryStream {Position = 0};
            using var utf8JsonWriter = new Utf8JsonWriter(msSt);
            utf8JsonWriter.WriteStartObject(root);
            JsonSerializer.Serialize(utf8JsonWriter, obj);
            utf8JsonWriter.WriteEndObject();
            utf8JsonWriter.Flush();
            using var reader = new StreamReader(msSt);
            return reader.ReadToEnd();
        }
    }


    public class customer
    {
        public string firstname;
        public string lastname;
    }

首先,目前 System.Text.Json 不支持序列化字段,因此您需要更改 class(请参阅 对 public 和非 public 字段 docs):

public class customer
{
    public string firstname {get;set;}
    public string lastname {get;set;}
}

之后你可以尝试下一步:

public static string AddRootToJson(string root, object obj)
{
    using var msSt = new MemoryStream();
    using var utf8JsonWriter = new Utf8JsonWriter(msSt);
    utf8JsonWriter.WriteStartObject();
    utf8JsonWriter.WritePropertyName(root);
    JsonSerializer.Serialize(utf8JsonWriter, obj);
    utf8JsonWriter.WriteEndObject();
    utf8JsonWriter.Flush();
    return Encoding.UTF8.GetString(msSt.ToArray());
}

Console.WriteLine(AddRootToJson("test", new customer {firstname = "first", lastname = "last"})); // prints {"test":{"firstname":"first","lastname":"last"}}

如果我理解你更正你想要的结果是这样的:

{"test",
    [
      {"first",
      "last"}
      ....
    ]
}

只需为其创建另一个模型:

public class FullModel
{
    public List<Customer> Customers {get;set;}
    public string Root {get;set;}
}

并更改您的客户 class:

public class Customer
{
    public string FirstName {get;set;}
    public string LastName {get;set;}
}

现在,一步一步:

public static void Main(string[] args)
    {
        List<Customer> customers = new List<Customers>();
        customers.Add(new Customer{FirstName="first",LastName="last"});
        FullModel fullModel = new FullModel
        {
            Root = "test",
            Customers = customers
        };
         
        Console.WriteLine(AddRootToJson(cust));
    }

public static string AddRootToJson(object obj)
    {
        var msSt = new MemoryStream {Position = 0};
        using var utf8JsonWriter = new Utf8JsonWriter(msSt);
        JsonSerializer.Serialize(utf8JsonWriter, obj);
        utf8JsonWriter.WriteEndObject();
        utf8JsonWriter.Flush();
        using var reader = new StreamReader(msSt);
        return reader.ReadToEnd();
    }

您可以根据自己的看法更改方法。 希望它能帮助你。祝你好运。