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

如何为Blazor模型项目创建通用类处理多类型JSON响应?

处理Blazor多JSON响应的通用类方案

核心思路

针对多个后端JSON响应的公共属性+差异化属性场景,核心是公共属性抽象为基类,差异化属性用动态容器存储,同时用枚举统一公共枚举类字段(比如响应状态),既保证类型安全,又兼容新增的JSON结构。


具体实现

1. 定义公共基类与枚举

先把三个响应共有的属性抽成基类,同时用枚举替代字符串类型的公共字段(比如响应状态),避免硬编码:

using System.Text.Json.Serialization;

// 统一响应状态枚举
public enum ResponseStatus
{
    Success,
    Failed,
    Pending
}

// 公共基类:所有响应都包含的属性
public class BaseApiResponse
{
    public int Id { get; set; }
    [JsonConverter(typeof(JsonStringEnumConverter))] // 兼容后端返回的字符串状态
    public ResponseStatus Status { get; set; }
}

2. 两种动态兼容类实现

方式一:用JsonExtensionData自动捕获差异属性(推荐)

利用System.Text.Json的[JsonExtensionData]特性,自动将未匹配到类属性的JSON字段存入字典,序列化/反序列化完全自动:

public class FlexibleApiResponse : BaseApiResponse
{
    // 自动存储所有非公共属性,键是JSON字段名,值是原始JsonElement
    [JsonExtensionData]
    public Dictionary<string, JsonElement> ExtraProperties { get; set; } = new();
}
方式二:手动维护键值对字典

如果需要更灵活的类型控制,可手动定义字典存储差异属性:

public class GenericApiResponse : BaseApiResponse
{
    public Dictionary<string, object> ExtraData { get; set; } = new();
}

Blazor中使用示例

以FlexibleApiResponse为例,演示反序列化与差异化属性访问:

@inject HttpClient Http

@code {
    private FlexibleApiResponse _response;

    protected override async Task OnInitializedAsync()
    {
        // 从后端获取JSON响应
        var jsonString = await Http.GetStringAsync("/api/your-endpoint");
        _response = JsonSerializer.Deserialize<FlexibleApiResponse>(jsonString);

        // 根据状态处理不同属性
        switch (_response.Status)
        {
            case ResponseStatus.Success:
                // 解析UserInfo(假设响应包含该字段)
                if (_response.ExtraProperties.TryGetValue("UserInfo", out var userElement))
                {
                    var userInfo = userElement.Deserialize<UserInfo>();
                    // 处理用户信息逻辑
                }
                break;
            case ResponseStatus.Failed:
                // 解析ErrorDetails
                var error = _response.ExtraProperties["ErrorDetails"].Deserialize<ErrorDetails>();
                // 处理错误逻辑
                break;
            case ResponseStatus.Pending:
                // 解析Progress
                var progress = _response.ExtraProperties["Progress"].GetInt32();
                // 处理进度逻辑
                break;
        }
    }

    // 按需定义差异化属性对应的实体类
    private class UserInfo { public string Name { get; set; } }
    private class ErrorDetails { public int Code { get; set; } public string Msg { get; set; } }
}

新增JSON的兼容性

如果后续新增后端JSON响应,只要包含Id和Status两个公共属性,其他新增字段会自动被ExtraProperties捕获,无需修改现有类结构,完全兼容。

内容的提问来源于stack exchange,提问作者baha mestiri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 17:22:45