如何使用 System.Text.Json 库在现有 json 中添加属性?

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 这有效,但我很确定应该存在更好的解决方案。

  • “我很确定应该存在更好的解决方案。” 确切地 (3认同)