You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 8中操作JsonNode避免空引用编译器警告的最佳实践

处理JSON可空引用类型的规范代码方案

在C# 8.0+及.NET 8中,处理JSON时既要遵循可空引用类型的设计规范,又要避免冗余代码,推荐以下几种实用方案:

1. 优先使用强类型DTO(数据传输对象)

这是最简洁且易维护的方式,直接将JSON反序列化为强类型对象,利用System.Text.Json的序列化验证机制处理空值和缺失属性问题,同时编译器会自动进行可空检查。

示例代码:

using System.ComponentModel.DataAnnotations;
using System.Text.Json;

// 定义强类型DTO,标记必填属性
public class JsonPayload
{
    [Required(ErrorMessage = "determinant属性不能为空")]
    public string Determinant { get; set; } = string.Empty;
}

void ManipulateJson(string jsonString)
{
    // 反序列化时自动验证必填属性,若缺失或为空会抛出异常
    var payload = JsonSerializer.Deserialize<JsonPayload>(jsonString, new JsonSerializerOptions
    {
        PropertyNameCaseInsensitive = true
    }) ?? throw new InvalidOperationException("JSON反序列化失败");

    string id = newId(payload.Determinant); 

    // 如需修改原JSON节点,可再解析为JsonNode
    JsonNode node = JsonNode.Parse(jsonString) ?? throw new InvalidOperationException("JSON无效");
    node["id"] = id;
}

2. 封装扩展方法简化空验证

针对JsonNode编写通用扩展方法,将空检查和异常抛出的逻辑封装起来,业务代码中直接调用,减少重复代码。

示例代码:

using System.Text.Json.Nodes;

public static class JsonNodeExtensions
{
    /// <summary>
    /// 获取指定名称的必填JSON节点,缺失则抛出异常
    /// </summary>
    public static JsonNode GetRequiredNode(this JsonNode node, string propertyName)
    {
        return node[propertyName] ?? throw new KeyNotFoundException($"JSON属性 '{propertyName}' 缺失");
    }

    /// <summary>
    /// 从节点中获取指定类型的必填值,无法转换则抛出异常
    /// </summary>
    public static T GetRequiredValue<T>(this JsonNode node)
    {
        var value = node.GetValue<T>();
        if (value == null && typeof(T).IsReferenceType)
            throw new InvalidCastException($"无法将JSON节点转换为非可空类型 {typeof(T).Name}");
        return value!;
    }
}

// 业务代码中使用
void ManipulateJson(string jsonString)
{
    JsonNode node = JsonNode.Parse(jsonString) ?? throw new InvalidOperationException("JSON无效");
    string determinant = node.GetRequiredNode("determinant").GetRequiredValue<string>();
    string id = newId(determinant);
    node["id"] = id;
}

3. 结合模式匹配简化空检查

利用C#的模式匹配语法,直接在代码中完成空判断,减少中间变量的定义,提升代码简洁性。

示例代码:

void ManipulateJson(string jsonString)
{
    if (JsonNode.Parse(jsonString) is not JsonNode node)
        throw new InvalidOperationException("JSON无效");

    if (node["determinant"] is not JsonNode determinantNode || 
        determinantNode.GetValue<string>() is not string determinant)
        throw new InvalidOperationException("determinant属性缺失或不是有效字符串");

    string id = newId(determinant);
    node["id"] = id;
}

以上方案既遵循了可空引用类型的安全设计,又避免了冗余代码,同时保证了代码的可读性和可维护性,处理多个JSON属性时优势更明显。

内容的提问来源于stack exchange,提问作者Vivian River

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 01:40:03