C#中如何修改JSON字符串指定层级的元素节点名称?
仅修改指定层级JSON节点名称的解决方案
问题场景
获取到如下JSON字符串:
{ "DataKEY": [ { "value": { "timestamp": "2022-10-26T05:00:00Z", "value": 0.0 } }, { "value": { "timestamp": "2022-10-26T06:00:00Z", "value": 0.0 } } ] }
需要将DataKEY数组内第一层的value节点名称改为KEY,但直接使用string.Replace("value", "KEY")会同时替换内层的value节点,导致错误结果。需要精准修改指定层级的节点名称,最终得到:
{ "DataKEY": [ { "KEY": { "timestamp": "2022-10-26T05:00:00Z", "value": 0.0 } }, { "KEY": { "timestamp": "2022-10-26T06:00:00Z", "value": 0.0 } } ] }
解决方案
通过JSON解析库精准定位层级节点进行修改,避免字符串替换的盲目性,以下是两种常用实现方式:
方式一:使用.NET官方库System.Text.Json
适用于.NET Core/.NET 5及以上版本,无需额外安装包:
using System; using System.Text.Json; var originalJson = @" { ""DataKEY"": [ { ""value"": { ""timestamp"": ""2022-10-26T05:00:00Z"", ""value"": 0.0 } }, { ""value"": { ""timestamp"": ""2022-10-26T06:00:00Z"", ""value"": 0.0 } } ] }"; using JsonDocument doc = JsonDocument.Parse(originalJson); JsonElement root = doc.RootElement; using var writer = new Utf8JsonWriter(Console.OpenStandardOutput(), new JsonWriterOptions { Indented = true }); writer.WriteStartObject(); foreach (JsonProperty prop in root.EnumerateObject()) { writer.WritePropertyName(prop.Name); if (prop.Name == "DataKEY" && prop.Value.ValueKind == JsonValueKind.Array) { writer.WriteStartArray(); foreach (JsonElement item in prop.Value.EnumerateArray()) { writer.WriteStartObject(); foreach (JsonProperty itemProp in item.EnumerateObject()) { // 仅替换数组内第一层的"value"为"KEY" writer.WritePropertyName(itemProp.Name == "value" ? "KEY" : itemProp.Name); itemProp.Value.WriteTo(writer); } writer.WriteEndObject(); } writer.WriteEndArray(); } else { prop.Value.WriteTo(writer); } } writer.WriteEndObject();
方式二:使用Newtonsoft.Json(Json.NET)
需先通过NuGet安装Newtonsoft.Json包:
using Newtonsoft.Json; using Newtonsoft.Json.Linq; var originalJson = @" { ""DataKEY"": [ { ""value"": { ""timestamp"": ""2022-10-26T05:00:00Z"", ""value"": 0.0 } }, { ""value"": { ""timestamp"": ""2022-10-26T06:00:00Z"", ""value"": 0.0 } } ] }"; JObject jsonObj = JObject.Parse(originalJson); JArray dataArray = (JArray)jsonObj["DataKEY"]; foreach (JObject item in dataArray.Children<JObject>()) { if (item.ContainsKey("value")) { var valueToken = item["value"]; item.Remove("value"); item.Add("KEY", valueToken); } } string modifiedJson = jsonObj.ToString(Formatting.Indented); Console.WriteLine(modifiedJson);
两种方式均通过解析JSON结构,精准定位到DataKEY数组内的第一层value节点进行修改,不会影响内层的value键,确保结果符合预期。
内容的提问来源于stack exchange,提问作者Bash
相关产品推荐
相关产品推荐

