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

use*_*839 1 c# system.text.json

所有,当执行以下代码时,我们遇到以下异常(以粗体显示),我们试图将根节点“test”添加到最终的 json 结果中。我们希望在没有匿名对象或包装类的情况下实现这一点。

“无法在数组中写入 JSON 属性或将其作为第一个 JSON 令牌。当前令牌类型为“无”。

 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;
    }
Run Code Online (Sandbox Code Playgroud)

Gur*_*ron 5

首先,目前System.Text.Json不支持序列化字段,因此您需要更改您的类(请参阅文档对公共和非公共字段的支持):

public class customer
{
    public string firstname {get;set;}
    public string lastname {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

之后您可以尝试下一步:

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"}}
Run Code Online (Sandbox Code Playgroud)