Ios 获取JSON数据时发现nil
我不知道为什么JSON结构上没有。下面是代码。 结构相对简单,但不知何故,我无法解析解码后的JSON ContentView.swiftIos 获取JSON数据时发现nil,ios,json,swiftui,Ios,Json,Swiftui,我不知道为什么JSON结构上没有。下面是代码。 结构相对简单,但不知何故,我无法解析解码后的JSON ContentView.swift import SwiftUI var fetchTotal = getTotalValue() struct ContentView: View { var body: some View { Text(fetchTotal) //Text("gg") } } struct ContentView_Previews: PreviewPr
import SwiftUI
var fetchTotal = getTotalValue()
struct ContentView: View {
var body: some View {
Text(fetchTotal)
//Text("gg")
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
已解码的_structure.swift:
import Foundation
import SwiftUI
struct PostTotal: Codable {
var rows: [Layer0]
struct Layer0: Codable, Hashable {
var totalmarketvalue: String
var totaltodaysprofit: String
var todaysprofitpercent: String
var totalasset: String
var maxpurchasepower: String
}
}
let webstringtotal: String = "http://gsx2json.com/api?id=1z9WvS25hDvLaNPX1HwTE-CiJ46UvmqlUWT-iWVT0aJY&sheet=1&integers=false&column=false"
func getTotalValue() -> String {
let urlTotal = URL(string: webstringtotal)
var results: String = ""
URLSession.shared.dataTask(with: urlTotal!) { (datas, _, _) in
let postss = try! JSONDecoder().decode([PostTotal.Layer0].self, from: datas!)
//let layer0 = [postss.rows]
results = postss[0].totalasset
}
.resume()
return results
}
以及错误消息:
2020-06-11 15:51:46.211463+0800 PureTestProject[28884:988078] [Agent] Received remote injection
2020-06-11 15:51:46.211753+0800 PureTestProject[28884:988078] [Agent] Create remote injection Mach transport: 600001500770
2020-06-11 15:51:46.212150+0800 PureTestProject[28884:988022] [Agent] No global connection handler, using shared user agent
2020-06-11 15:51:46.212339+0800 PureTestProject[28884:988022] [Agent] Received connection, creating agent
2020-06-11 15:51:46.897118+0800 PureTestProject[28884:988022] [Agent] Received message: < DTXMessage 0x600001a150e0 : i2.0e c0 object:(__NSDictionaryI*) {
"products" : <NSArray 0x600003c141b0 | 1 objects>
"id" : [0]
"scaleFactorHint" : [3]
"providerName" : "15PureTestProject20ContentView_PreviewsV"
"updates" : <NSArray 0x7fff8062d430 | 0 objects>
} > {
"serviceCommand" : "forwardMessage"
"type" : "display"
}
2020-06-11 15:51:46.938191+0800 PureTestProject[28884:988035] App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
2020-06-11 15:51:46.938349+0800 PureTestProject[28884:988035] Cannot start load of Task <EF8F8A3E-E1FC-4E80-808A-1B576BBCDBD6>.<1> since it does not conform to ATS policy
2020-06-11 15:51:46.940051+0800 PureTestProject[28884:988033] Task <EF8F8A3E-E1FC-4E80-808A-1B576BBCDBD6>.<1> finished with error [-1022] Error Domain=NSURLErrorDomain Code=-1022 "The resource could not be loaded because the App Transport Security policy requires the use of a secure connection." UserInfo={NSUnderlyingError=0x6000030045d0 {Error Domain=kCFErrorDomainCFNetwork Code=-1022 "(null)"}, NSErrorFailingURLStringKey=http://gsx2json.com/api?id=1z9WvS25hDvLaNPX1HwTE-CiJ46UvmqlUWT-iWVT0aJY&sheet=1&integers=false&column=false, NSErrorFailingURLKey=http://gsx2json.com/api?id=1z9WvS25hDvLaNPX1HwTE-CiJ46UvmqlUWT-iWVT0aJY&sheet=1&integers=false&column=false, NSLocalizedDescription=The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.}
Fatal error: Unexpectedly found nil while unwrapping an Optional value: file /Users/benny/temp_files/test_xcode_11/PureTestProject/PureTestProject/Decoded_struct.swift, line 31
2020-06-11 15:51:46.957521+0800 PureTestProject[28884:988033] Fatal error: Unexpectedly found nil while unwrapping an Optional value: file /Users/benny/temp_files/test_xcode_11/PureTestProject/PureTestProject/Decoded_struct.swift, line 31
(lldb)
2020-06-11 15:51:46.211463+0800 PureTestProject[28884:988078][Agent]接受远程注入
2020-06-11 15:51:46.211753+0800 PureTestProject[28884:988078][Agent]创建远程喷射马赫数传输:600001500770
2020-06-11 15:51:46.212150+0800 PureTestProject[28884:988022][Agent]无全局连接处理程序,使用共享用户代理
2020-06-11 15:51:46.212339+0800 PureTestProject[28884:988022][Agent]已收到连接,正在创建代理
2020-06-11 15:51:46.897118+0800 PureTestProject[28884:988022][Agent]收到消息: {
“serviceCommand”:“forwardMessage”
“类型”:“显示”
}
2020-06-11 15:51:46.938191+0800 PureTestProject[28884:988035]应用程序传输安全已阻止明文HTTP(HTTP://)资源加载,因为它不安全。可以通过应用程序的Info.plist文件配置临时异常。
2020-06-11 15:51:46.938349+0800 PureTestProject[28884:988035]无法启动任务加载。因为它不符合ATS政策
2020-06-11 15:51:46.940051+0800 PureTestProject[28884:988033]任务。完成时出现错误[-1022]error Domain=NSURLErrorDomain Code=-1022“由于应用程序传输安全策略要求使用安全连接,因此无法加载资源。”UserInfo={NSUnderlyingError=0x6000030045d0{error Domain=kCFErrorDomainCFNetwork Code=-1022(null)},NSErrorFailingURLStringKey=http://gsx2json.com/api?id=1z9WvS25hDvLaNPX1HwTE-CiJ46UvmqlUWT-iWVT0aJY&sheet=1&integers=false&column=false,NSERRORFAILINGURKEY=http://gsx2json.com/api?id=1z9WvS25hDvLaNPX1HwTE-CiJ46UvmqlUWT-iWVT0aJY&sheet=1&integers=false&column=false,NSLocalizedDescription=由于应用程序传输失败,无法加载资源安全策略要求使用安全连接。}
致命错误:在展开可选值时意外发现nil:file/Users/benny/temp_files/test_xcode_11/PureTestProject/PureTestProject/Decoded_struct.swift,第31行
2020-06-11 15:51:46.957521+0800 PureTestProject[28884:988033]致命错误:在展开可选值时意外发现零:file/Users/benny/temp_files/test_xcode_11/PureTestProject/PureTestProject/Decoded_struct.swift,第31行
(lldb)
错误表明您正在使用http:///进行连接。
苹果不喜欢这样,它希望https://。
但是您可以在info.plist中提供一个例外来解决这个问题。因此,您的“数据”为零,如前所述,您正在尝试将其展开,从而触发错误消息
下面是要放入info.plist的一个示例:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
“无法加载资源,因为应用程序传输安全策略要求使用安全连接”。这是主要原因。阅读日志<代码>数据代码>这就是造成崩溃的原因。如果您不理解,请避免使用强制展开(即
!
)。或者至少,把它们一行一行地拆开,看看是哪一个失败了,然后导致了崩溃。非常感谢!看起来“find nil”问题消失了,但我收到了另一个抱怨线程3:致命错误:“try!”表达式意外引发错误:Swift.DecodingError.typeMismatch(Swift.Array,Swift.DecodingError.Context(codingPath:[],debugDescription:“应解码数组,但找到了一个字典。”,underlyingError:nil))查看json,它以“{”列开头:{…但是你的PostTotal结构没有。我已经更新了我的答案,以显示我正在使用的测试代码。非常感谢!最后,我解决了“find nil”问题,它确实返回了正确的值。但不知怎的,我就是看不到ContentView中的值……这是可以理解的。getTotalValue()是一个异步函数。您需要等到它完成后才能使用结果。使用getTotalValue()的方法行不通。请学习异步编码。祝您好运。
import Foundation
import SwiftUI
struct ContentView: View {
@State var results: PostTotal?
var body: some View {
VStack (alignment: .leading) {
Text("totalasset: \(results?.rows[0].totalasset ?? " fetching data ...") ")
Text("maxpurchasepower: \(results?.rows[0].maxpurchasepower ?? " fetching data ..." )")
}.onAppear(perform: loadData)
}
func loadData() {
getTotalValue() { res in
self.results = res
}
}
}
struct PostTotal: Codable {
var columns: Layer1
var rows: [Layer0]
struct Layer0: Codable, Hashable {
var totalmarketvalue: String
var totaltodaysprofit: String
var todaysprofitpercent: String
var totalasset: String
var maxpurchasepower: String
}
struct Layer1: Codable, Hashable {
var totalmarketvalue: [String]
var totaltodaysprofit: [String]
var todaysprofitpercent: [String]
var totalasset: [String]
var maxpurchasepower:[String]
}
}
let webstringtotal: String = "http://gsx2json.com/api?id=1z9WvS25hDvLaNPX1HwTE-CiJ46UvmqlUWT-iWVT0aJY&sheet=1&integers=false&column=false"
func getTotalValue(handler: @escaping (PostTotal?) -> Void) {
let urlTotal = URL(string: webstringtotal)
URLSession.shared.dataTask(with: urlTotal!) { (datas, _, _) in
if let theData = datas, let postss = try? JSONDecoder().decode(PostTotal.self, from: theData) {
return handler(postss)
} else {
return handler(nil)
}
}
.resume()
}