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

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")]
  • 如果JSON里的字段可能为null,可以把实体类的属性设为可空类型(比如public string? WeatherText { get; set; },适用于C# 8.0+)

内容的提问来源于stack exchange,提问作者Shahzad Naseer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:04:42