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

