Ios 获取JSON数据时发现nil

Ios 获取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

我不知道为什么JSON结构上没有。下面是代码。 结构相对简单,但不知何故,我无法解析解码后的JSON

ContentView.swift

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()
}