如何使用System.Text.Json为JsonElement添加新属性?
如何为JsonElement添加新属性?
因为JsonElement是只读类型,无法直接修改它的属性或结构。要实现添加新属性的需求,必须先将其转换为可变的JSON结构,修改完成后再转换回JsonElement,最后更新原字典中的对应值。
方案一:.NET 6+ 使用JsonNode(推荐)
JsonNode是.NET 6引入的可变JSON DOM API,操作简洁直观:
var metaValue = metas["key-1"]; if (metaValue is JsonElement elementValue && elementValue.ValueKind == JsonValueKind.Array) { // 将数组JsonElement转换为可变的JsonArray var jsonArray = JsonNode.Parse(elementValue.GetRawText()) as JsonArray; if (jsonArray != null) { foreach (var node in jsonArray) { // 仅处理对象类型的数组元素 if (node is JsonObject jsonObj) { // 添加新属性 jsonObj["newproperty"] = "test value"; } } // 将修改后的JsonArray转换回JsonElement using var doc = JsonDocument.Parse(jsonArray.ToJsonString()); var updatedElement = doc.RootElement.Clone(); // 更新原字典中的值 metas["key-1"] = updatedElement; } }
方案二:.NET 5及以下 反序列化为字典列表
如果项目基于.NET 5或更早版本,可通过序列化/反序列化转换为可变集合:
var metaValue = metas["key-1"]; if (metaValue is JsonElement elementValue && elementValue.ValueKind == JsonValueKind.Array) { // 反序列化为可变的对象列表 var items = JsonSerializer.Deserialize<List<Dictionary<string, object>>>(elementValue); if (items != null) { foreach (var item in items) { // 添加新属性 item["newproperty"] = "test value"; } // 序列化回JsonElement using var stream = new MemoryStream(); JsonSerializer.Serialize(stream, items); stream.Position = 0; using var doc = JsonDocument.Parse(stream); var updatedElement = doc.RootElement.Clone(); // 更新原字典 metas["key-1"] = updatedElement; } }
注意事项
- 必须调用
RootElement.Clone():JsonDocument是一次性对象,释放后内部的JsonElement会失效,克隆后可独立使用。 - 类型判断:要确保数组元素是JSON对象类型(
JsonValueKind.Object),避免非对象元素添加属性报错,代码已包含对应判断。 - 性能考量:序列化/反序列化存在一定性能开销,处理大量数据时优先选择
JsonNode方案。
内容的提问来源于stack exchange,提问作者Youxu
相关产品推荐
相关产品推荐

