Kun*_*til 11 c# json .net-core-3.0 system.text.json
{
"TestData":{
"Year__of__Account":"2019",
"Tax___x0025_":"0.06",
"Buildings__1":"1000",
"Contents__1":"400",
"Total_Insurable_Value":"100",
"Buildings__Prem":"2560.8",
"Contents__Prem":"1707.2",
"YB__1":"1950",
"No__Buildings":"55",
"Location_Sprinklers_YN":"No",
"test":"test"
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的示例 JSON 中,我想在属性“TestData”中添加一个名为“Name”且值为“John”的属性。如何使用 .net Core 3.0 System.Text.Json 库实现这一点。
我曾尝试使用 Utf8JsonWriter 的方法,但它正在创建一个新的 JSON 对象,而不是将其附加到上述现有的 JSON。
using (MemoryStream memoryStream1 = new MemoryStream())
{
using (Utf8JsonWriter utf8JsonWriter1 = new Utf8JsonWriter(memoryStream1))
{
using (JsonDocument jsonDocument = JsonDocument.Parse(json))
{
utf8JsonWriter1.WriteStartObject();
utf8JsonWriter1.WritePropertyName("Name");
utf8JsonWriter1.WriteStringValue("John");
utf8JsonWriter1.WriteEndObject();
// how can I add above properties to JsonDocument object??
}
}
}
Run Code Online (Sandbox Code Playgroud)
Yve*_*ves 21
从 .NET 6 开始,您可以使用JsonNode. 这是一个可修改的、字典支持的 API,用于补充只读 JsonDocument。
对于您的示例,解决方案如下:
var jsonNode = JsonNode.Parse(json);
jsonNode["TestData"]["Name"] = "John";
Run Code Online (Sandbox Code Playgroud)
小智 9
假设可能有多个属性,并且您只想为“TestData”属性添加一个名称:
using (MemoryStream memoryStream1 = new MemoryStream())
{
using (Utf8JsonWriter utf8JsonWriter1 = new Utf8JsonWriter(memoryStream1))
{
using (JsonDocument jsonDocument = JsonDocument.Parse(json))
{
utf8JsonWriter1.WriteStartObject();
foreach (var element in jsonDocument.RootElement.EnumerateObject())
{
if (element.Name == "TestData")
{
utf8JsonWriter1.WritePropertyName(element.Name);
// Staring new object
utf8JsonWriter1.WriteStartObject();
// Adding "Name" property
utf8JsonWriter1.WritePropertyName("Name");
utf8JsonWriter1.WriteStringValue("John");
// Copying existing values from "TestData" object
foreach (var testDataElement in element.Value.EnumerateObject())
{
testDataElement.WriteTo(utf8JsonWriter1);
}
utf8JsonWriter1.WriteEndObject();
}
else
{
element.WriteTo(utf8JsonWriter1);
}
}
utf8JsonWriter1.WriteEndObject();
}
}
var resultJson = Encoding.UTF8.GetString(memoryStream1.ToArray());
}
Run Code Online (Sandbox Code Playgroud)
对于每个属性(“TestData”属性除外),我按原样写入整个值(通过调用element.WriteTo(utf8JsonWriter1)),对于“TestData”属性,我启动一个新对象,添加“Name”属性,然后复制每个“TestData”对象的属性。
PS 这有效,但我很确定应该存在更好的解决方案。