【发布时间】:2022-01-21 06:13:00
【问题描述】:
我正在尝试制作一个显示灯泡统计信息的视图,我想显示设备是打开还是关闭以及它的亮度是多少。我已经有一个可以以 JSON 格式返回此信息的 API,并且还有一个 Web GUI。但是我想在我的 iPhone 上制作一个应用程序,所以我对 Swift 非常陌生,所以使用这个 video 来解析来自 API 的 JSON 响应并将其打印到控制台。我现在不知道如何将我获得的信息实际放入可见的文本中。我将向您展示我得到的 JSON 返回和我已经完成的代码:
解析的 JSON
BulbInfo(error_code: 0, result: UITest.Result(device_on: true, brightness: 100))
API 返回 JSON
{'error_code': 0,
'result': {
'device_id': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'fw_ver': '1.1.9 Build 20210122 Rel. 56165',
'hw_ver': '1.0.0',
'type': 'SMART.TAPOBULB',
'model': 'L510 Series',
'mac': 'xx-xx-xx-xx-xx-xx',
'hw_id': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'fw_id': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'oem_id': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'specs': 'EU',
'lang': 'en_US',
'device_on': True,
'on_time': 3065,
'overheated': False,
'nickname': 'TWFpbiBMaWdodA==',
'avatar': 'hang_lamp_1',
'brightness': 100,
'default_states': {
'brightness': {
'type': 'last_states',
'value': 100
}
},
'time_diff': 0,
'region': 'Europe/London',
'longitude': -xxxxx,
'latitude': xxxxxx,
'has_set_location_info': True,
'ip': '192.168.x.xxx',
'ssid': 'xxxxxxxxxxxx',
'signal_level': 1,
'rssi': -xx
}
}
ContentView.swift
import SwiftUI
struct ContentView: View {
func getDeviceInfo(){
let urlString = "http://192.168.x.xxx:xxx/get_bulb_info"
let url = URL(string:urlString)
let session = URLSession.shared
let dataTask = session.dataTask(with: url!){(data,response,error)in
// Check for error
if error == nil && data != nil {
// Parse JSON
let decoder = JSONDecoder()
do{
let bulbInfo = try decoder.decode(BulbInfo.self, from: data!)
print(bulbInfo)
}
catch{
print(error)
}
}
}
dataTask.resume()
}
var body: some View {
Text("Main Light:").padding()
Button(action:getDeviceInfo){
Text("Get Device Info!")
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
Bulb.swift
//
// Bulb.swift
// UITest
//
// Created by James Westhead on 18/12/2021.
//
import Foundation
struct BulbInfo: Codable{
var error_code: Int
var result: Result
}
struct Result: Codable{
var device_on:Bool
var brightness: Int
}
【问题讨论】:
-
创建一个
@State var bulbInfo: BulbInfo? = nil(或类似的东西)并从do块中删除let -
但是如何在
Text("Main Light: ")旁边的视图中显示它 -
您说您的 JSON 解析有效,所以它应该类似于
bulbInfo.result.device_on.description或bulbInfo.result.brightness.description -
嗯嗯嗯好的谢谢
-
我很高兴它有帮助,我添加了一个答案,您介意接受它吗?