C#中JSON对象反序列化:处理指定天气JSON内容的技术问询
在C#中反序列化目标JSON的实现方法
Hey,我来帮你搞定这个JSON的反序列化问题。首先咱们得先把对应的C#实体类定义出来——你的JSON包含嵌套结构(比如Temperature下的Metric和Imperial),而且外层是数组,所以实体类要和JSON的层级完全对应上。
第一步:定义对应实体类
根据JSON结构,我们可以创建以下几个类:
// 对应Metric和Imperial温度单元的通用类 public class TemperatureUnit { public double Value { get; set; } public string Unit { get; set; } public int UnitType { get; set; } } // 对应Temperature对象 public class Temperature { public TemperatureUnit Metric { get; set; } public TemperatureUnit Imperial { get; set; } } // 最外层的天气数据类 public class CurrentWeather { public DateTimeOffset LocalObservationDateTime { get; set; } public long EpochTime { get; set; } public string WeatherText { get; set; } public int WeatherIcon { get; set; } public bool IsDayTime { get; set; } public Temperature Temperature { get; set; } public string MobileLink { get; set; } public string Link { get; set; } }
注意:
LocalObservationDateTime用DateTimeOffset比DateTime更合适,因为JSON里带时区偏移信息,能更准确地处理时间。
第二步:选择反序列化库实现
C#里常用的JSON反序列化库有两个,我分别给你演示:
方法1:使用Newtonsoft.Json(Json.NET)
这是.NET生态中非常流行的第三方库,需要先通过NuGet安装Newtonsoft.Json包。
实现代码:
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; class Program { static void Main() { // 你的目标JSON字符串 string json = @"[{ ""LocalObservationDateTime"": ""2018-04-23T08:10:00+05:00"", ""EpochTime"": 1524453000, ""WeatherText"": ""Sunny"", ""WeatherIcon"": 1, ""IsDayTime"": true, ""Temperature"": { ""Metric"": { ""Value"": 29.6, ""Unit"": ""C"", ""UnitType"": 17 }, ""Imperial"": { ""Value"": 85.0, ""Unit"": ""F"", ""UnitType"": 18 } }, ""MobileLink"": ""http://m.accuweather.com/en/pk/jamaluddinwali/259991/current-weather/259991?lang=en-us"", ""Link"": ""http://www.accuweather.com/en/pk/jamaluddinwali/259991/current-weather/259991?l..."" }]"; // 反序列化为List<CurrentWeather>(因为外层是数组) List<CurrentWeather> weatherList = JsonConvert.DeserializeObject<List<CurrentWeather>>(json); // 验证并访问数据示例 if (weatherList != null && weatherList.Any()) { var firstWeather = weatherList[0]; Console.WriteLine($"天气状况: {firstWeather.WeatherText}"); Console.WriteLine($"当前温度(公制): {firstWeather.Temperature.Metric.Value}°{firstWeather.Temperature.Metric.Unit}"); Console.WriteLine($"当前温度(英制): {firstWeather.Temperature.Imperial.Value}°{firstWeather.Temperature.Imperial.Unit}"); } } }
方法2:使用System.Text.Json(.NET Core 3.0+/.NET 5+自带)
如果你用的是较新的.NET版本,直接用官方自带的System.Text.Json就可以,不需要额外安装包。
实现代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; class Program { static void Main() { // 你的目标JSON字符串 string json = @"[{ ""LocalObservationDateTime"": ""2018-04-23T08:10:00+05:00"", ""EpochTime"": 1524453000, ""WeatherText"": ""Sunny"", ""WeatherIcon"": 1, ""IsDayTime"": true, ""Temperature"": { ""Metric"": { ""Value"": 29.6, ""Unit"": ""C"", ""UnitType"": 17 }, ""Imperial"": { ""Value"": 85.0, ""Unit"": ""F"", ""UnitType"": 18 } }, ""MobileLink"": ""http://m.accuweather.com/en/pk/jamaluddinwali/259991/current-weather/259991?lang=en-us"", ""Link"": ""http://www.accuweather.com/en/pk/jamaluddinwali/259991/current-weather/259991?l..."" }]"; // 反序列化为List<CurrentWeather> List<CurrentWeather> weatherList = JsonSerializer.Deserialize<List<CurrentWeather>>(json); // 验证并访问数据示例 if (weatherList != null && weatherList.Any()) { var firstWeather = weatherList[0]; Console.WriteLine($"天气状况: {firstWeather.WeatherText}"); Console.WriteLine($"当前温度(公制): {firstWeather.Temperature.Metric.Value}°{firstWeather.Temperature.Metric.Unit}"); Console.WriteLine($"当前温度(英制): {firstWeather.Temperature.Imperial.Value}°{firstWeather.Temperature.Imperial.Unit}"); } } }
额外提示
- 如果需要修改实体类的属性名(比如不想用
LocalObservationDateTime这么长的名字),可以用特性映射:- Newtonsoft.Json:给属性加
[JsonProperty("LocalObservationDateTime")] - System.Text.Json:给属性加
[JsonPropertyName("LocalObservationDateTime")]
- Newtonsoft.Json:给属性加
- 如果JSON里的字段可能为null,可以把实体类的属性设为可空类型(比如
public string? WeatherText { get; set; },适用于C# 8.0+)
内容的提问来源于stack exchange,提问作者Shahzad Naseer
相关产品推荐
相关产品推荐

