jsonnode.parse()后需逐层判空或用?.安全取嵌套字段,如root["user"]?["profile"]?["email"]?.getvalue() ?? "",否则中间null会引发nullreferenceexception。

直接用 JsonNode 就行,.NET 6+ 原生支持、无需额外包、类型安全又灵活——别再用 dynamic 或 JObject 硬扛未知结构。
JsonNode.Parse() 后怎么安全取嵌套字段?
不能链式写 root["user"]["profile"]["email"],中间任意一级为 null 就崩。必须逐层判空或用空条件操作符。
-
root["user"]?["profile"]?["email"]?.GetValueKind() == JsonValueKind.String才调.GetValue<string>()</string> - 数组访问前先确认是
JsonArray:if (root["items"] is JsonArray items) - 取值失败时返回默认值比抛异常更可控:
root["count"]?.GetValue<int>() ?? 0</int>
动态增删改字段为什么报错“无法将 null 转换为 JsonObject”?
因为 node["config"] 返回的是 JsonNode?,不是 JsonObject,直接 ["timeout"] = 5000 会触发 NullReferenceException。
- 新增嵌套对象必须显式创建:
node["config"] = JsonObject.Create(); - 修改前先转型并判空:
if (node["config"] is JsonObject config) config["timeout"] = JsonValue.Create(5000); - 删字段必须走
AsObject():node.AsObject().Remove("temp"),AsArray()同理
JsonSerializer.SerializeToNode() 和 JsonNode.Parse() 有什么区别?
JsonNode.Parse() 只接受字符串,而 JsonSerializer.SerializeToNode()(.NET 7+)可直接从 C# 对象生成 JsonNode,跳过字符串序列化环节。
- .NET 6 没
SerializeToNode?用JsonSerializer.Deserialize<jsonnode>(JsonSerializer.Serialize(data))</jsonnode>替代 - 传入
Dictionary<string object></string>时,value 里含DateTime、Stream等不可序列化类型会直接抛NotSupportedException - 想控制格式(如忽略 null、驼峰命名),得提前传
JsonSerializerOptions给SerializeToNode
最易被忽略的一点:JsonNode 是延迟解析的,Parse() 不会立刻验证 JSON 合法性,直到你第一次访问某个字段才可能抛 JsonException。真要校验,得手动调 TryGetPropertyValue 或包裹在 try/catch 里做探针访问。










