如何将指定URL的JSON数据反序列化为目标类结构?
问题分析与解决方案
你的代码核心问题在于:目标URL返回的是Region对象的数组,但现有逻辑试图将其反序列化为单个Region实例,同时Rootobject初始化后regions属性为null,直接赋值索引会触发空引用异常。以下是修正后的实现:
修正后的完整代码
public class IndexModel : PageModel { // 用于页面展示的数据源属性 public Rootobject RegionData { get; set; } public void OnGet() { RegionData = new Rootobject(); // 直接反序列化为Region数组并赋值 RegionData.regions = _download_serialized_json_data<Region[]>("https://visservice.meteoalarm.org/api/v1/regions?language=ATOM"); } // 通用泛型方法,支持任意类型的JSON反序列化 private static T _download_serialized_json_data<T>(string url) where T : new() { using (var w = new WebClient()) { var json_data = string.Empty; try { json_data = w.DownloadString(url); } catch (Exception) { // 可添加日志记录,方便排查下载失败问题 } return !string.IsNullOrEmpty(json_data) ? JsonConvert.DeserializeObject<T>(json_data) : new T(); } } public class Rootobject { public Region[] regions { get; set; } } public class Region { public bool active { get; set; } public float[][] bb { get; set; } public string code { get; set; } public string name { get; set; } } }
关键调整说明
- 泛型方法
_download_serialized_json_data改为支持任意类型,无需硬编码返回单个Region,适配数组类型的反序列化需求。 - 新增
RegionData属性作为页面绑定的数据源,在Razor页面中可通过@Model.RegionData.regions遍历所有区域数据进行展示。 - 移除了原代码中对
regions[0]的直接赋值,避免空引用异常。
内容的提问来源于stack exchange,提问作者povodnikt
相关产品推荐
相关产品推荐

