如何为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
相关产品推荐
相关产品推荐

