如何使用System.Text.Json在现有JSON的TestData中添加属性?
在.NET Core 3.0中用System.Text.Json给现有JSON追加属性的解决方案
我明白你现在碰到的问题:想用System.Text.Json给现有JSON的TestData节点里加一个Name属性,但之前用Utf8JsonWriter的写法只是新建了一个独立对象,没有把原有JSON的内容合并进去对吧?
这主要是因为JsonDocument和JsonElement在System.Text.Json里是只读类型,没法直接修改它们。我们得换个思路:读取原有JSON的内容,用Utf8JsonWriter重新构建整个结构,在过程中把新属性加进去。
给你一个可以直接运行的示例代码,完美解决这个需求:
using System; using System.IO; using System.Text.Json; class Program { static void Main() { // 你的原始JSON字符串 string originalJson = @"{""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""}}"; // 解析原始JSON到只读的JsonDocument using (JsonDocument doc = JsonDocument.Parse(originalJson)) { JsonElement rootElement = doc.RootElement; // 获取目标TestData节点 JsonElement testDataElement = rootElement.GetProperty("TestData"); using (MemoryStream memoryStream = new MemoryStream()) { // 配置JsonWriter,开启缩进让输出更美观,可按需调整 var writerOptions = new JsonWriterOptions { Indented = true }; using (Utf8JsonWriter jsonWriter = new Utf8JsonWriter(memoryStream, writerOptions)) { // 开始写入根对象 jsonWriter.WriteStartObject(); // 写入TestData属性,开始TestData对象 jsonWriter.WritePropertyName("TestData"); jsonWriter.WriteStartObject(); // 遍历原TestData里的所有属性,逐个写入到新的JSON流中 foreach (JsonProperty property in testDataElement.EnumerateObject()) { property.WriteTo(jsonWriter); } // 在这里添加新的Name属性和值 jsonWriter.WriteString("Name", "John"); // 结束TestData对象和根对象的写入 jsonWriter.WriteEndObject(); jsonWriter.WriteEndObject(); } // 将MemoryStream转换为字符串,得到更新后的JSON string updatedJson = System.Text.Encoding.UTF8.GetString(memoryStream.ToArray()); Console.WriteLine(updatedJson); } } } }
关键说明:
- 核心思路是复制原有内容+追加新属性:因为原有JSON节点是只读的,我们只能先把原
TestData的所有属性都写入到新的JSON流里,再插入我们需要的新属性。 - 你的原代码没有处理原有
TestData的内容,所以才会生成只包含Name的新对象,现在这个写法完美解决了这个问题。 - 如果以后需要给其他节点添加属性,这个思路也完全通用,只需要调整获取目标节点的代码即可。
内容的提问来源于stack exchange,提问作者Kunal Patil
相关产品推荐
相关产品推荐

