使用 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();
}
您可以根据自己的看法更改方法。
希望它能帮助你。祝你好运。
全部, 执行以下代码时,我们 运行 进入以下异常(粗体),我们试图将根节点“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();
}
您可以根据自己的看法更改方法。 希望它能帮助你。祝你好运。