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

Swift 4 JSON解码问题:如何创建结构体提取温湿度字段

嘿,我完全懂你在解析这个天气JSON时遇到的头疼事儿——尤其是想提取main对象里的temp和humidity字段,结果在结构体定义上卡壳了对吧?别慌,我来给你捋清楚怎么解决。

先把你提供的完整JSON(补全了截断部分)放出来方便参考:

{"coord":{"lon":-82.26,"lat":27.76},"weather":[{"id":804,"main":"Clouds","description":"overcast clouds","icon":"04n"}],"base":"stations","main":{"temp":66.24,"pressure":1021,"humidity":63,"temp_min":62.6,"temp_max":69.8},"visibility":16093,"wind":{"speed":5.75,"deg":100},"clouds":{"all":90},"dt":1696123200,"sys":{"type":2,"id":2007064,"country":"US","sunrise":1696153903,"sunset":1696196647},"timezone":-14400,"id":4167147,"name":"Tampa","cod":200}
核心解决方案:匹配JSON层级的嵌套结构体

不管你用的是Go、C#还是其他静态类型语言,核心思路都是用嵌套结构体对应JSON的层级结构,并通过字段标签(或属性)把结构体字段和JSON键名绑定起来。下面以最常见的两种语言为例:

1. Go语言实现

Go的encoding/json包对结构体字段的大小写和标签要求很严格,这也是很多人踩坑的地方:

定义结构体

// WeatherResponse 对应整个JSON响应体
type WeatherResponse struct {
    Main MainData `json:"main"` // 嵌套结构体,对应JSON里的"main"对象
}

// MainData 专门对应JSON中"main"对象的字段
type MainData struct {
    Temp     float64 `json:"temp"`     // 绑定JSON的"temp"字段
    Humidity int     `json:"humidity"` // 绑定JSON的"humidity"字段
    // 如果你需要其他字段,比如pressure、temp_min,直接加在这里就行
}

解析示例

import (
    "encoding/json"
    "fmt"
)

func main() {
    jsonStr := `{"coord":{"lon":-82.26,"lat":27.76},"weather":[{"id":804,"main":"Clouds","description":"overcast clouds","icon":"04n"}],"base":"stations","main":{"temp":66.24,"pressure":1021,"humidity":63,"temp_min":62.6,"temp_max":69.8},"visibility":16093,"wind":{"speed":5.75,"deg":100},"clouds":{"all":90},"dt":1696123200,"sys":{"type":2,"id":2007064,"country":"US","sunrise":1696153903,"sunset":1696196647},"timezone":-14400,"id":4167147,"name":"Tampa","cod":200}`

    var resp WeatherResponse
    err := json.Unmarshal([]byte(jsonStr), &resp)
    if err != nil {
        fmt.Println("解析出错啦:", err)
        return
    }

    fmt.Printf("当前温度: %.2f°F\n", resp.Main.Temp)
    fmt.Printf("当前湿度: %d%%\n", resp.Main.Humidity)
}

2. C#语言实现

如果用C#,可以用System.Text.Json或者Newtonsoft.Json来解析,核心也是嵌套类+属性绑定:

定义类

using System.Text.Json.Serialization;

public class WeatherResponse
{
    [JsonPropertyName("main")]
    public MainData Main { get; set; }
}

public class MainData
{
    [JsonPropertyName("temp")]
    public double Temp { get; set; }

    [JsonPropertyName("humidity")]
    public int Humidity { get; set; }
}

解析示例

using System;
using System.Text.Json;

class Program
{
    static void Main()
    {
        string jsonStr = @"{""coord"":{""lon"":-82.26,""lat"":27.76},""weather"":[{""id"":804,""main"":""Clouds"",""description"":""overcast clouds"",""icon"":""04n""}],""base"":""stations"",""main"":{""temp"":66.24,""pressure"":1021,""humidity"":63,""temp_min"":62.6,""temp_max"":69.8},""visibility"":16093,""wind"":{""speed"":5.75,""deg"":100},""clouds"":{""all"":90},""dt"":1696123200,""sys"":{""type"":2,""id"":2007064,""country"":""US"",""sunrise"":1696153903,""sunset"":1696196647},""timezone"":-14400,""id"":4167147,""name"":""Tampa"",""cod"":200}";

        WeatherResponse resp = JsonSerializer.Deserialize<WeatherResponse>(jsonStr);

        Console.WriteLine($"当前温度: {resp.Main.Temp:F2}°F");
        Console.WriteLine($"当前湿度: {resp.Main.Humidity}%");
    }
}
常见踩坑点排查

如果你之前的代码没成功,大概率是这几个原因:

  • 字段可见性问题:Go的结构体字段必须大写开头,C#的类属性必须是public,否则解析器无法访问这些字段。
  • 标签/属性不匹配:比如把json:"temp"写成了json:"Temp",或者漏掉了标签,导致解析器找不到对应的JSON键。
  • 没嵌套结构体:直接在顶层结构体定义Temp和Humidity,但JSON里这两个字段是在main对象内部的,必须嵌套才能正确映射层级。

内容的提问来源于stack exchange,提问作者chris williams

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:11:12