【问题标题】:Swift JSON Decoding: Displaying ResultsSwift JSON 解码:显示结果
【发布时间】: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.descriptionbulbInfo.result.brightness.description
  • 嗯嗯嗯好的谢谢
  • 我很高兴它有帮助,我添加了一个答案,您介意接受它吗?

标签: ios json swift swiftui


【解决方案1】:

添加到ContentView

@State var bulbInfo: BulbInfo? = nil

然后从do catch 块中删除let

您可以使用类似的方式访问信息

bulbInfo.result.device_on.description

bulbInfo.result.brightness.description

Text里面

【讨论】:

    猜你喜欢
    • 2017-07-04
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多