Ios Swift json parse致命错误:在展开可选值时意外发现nil
您好,当我解析json数据时,这里的代码给了我致命的错误Ios Swift json parse致命错误:在展开可选值时意外发现nil,ios,json,swift,Ios,Json,Swift,您好,当我解析json数据时,这里的代码给了我致命的错误 let queue = NSOperationQueue(); NSURLConnection.sendAsynchronousRequest(storeRequest, queue: queue, completionHandler: { (response : NSURLResponse?, data : NSData?, error : NSError?) -> Void in if(error != nil){
let queue = NSOperationQueue();
NSURLConnection.sendAsynchronousRequest(storeRequest, queue: queue, completionHandler: { (response : NSURLResponse?, data : NSData?, error : NSError?) -> Void in
if(error != nil){
//Handle Error
}
else{
var jsonResponse: NSMutableDictionary?
do{
jsonResponse = try NSJSONSerialization.JSONObjectWithData(data!,
options: NSJSONReadingOptions.AllowFragments) as? NSMutableDictionary;
print(jsonResponse)
let info : NSArray = jsonResponse!.valueForKey("latest_receipt_info") as! NSArray
let transaction_id: String? = info[0].valueForKey("transaction_id") as? String
let web_order_line_item_id: String? = info[0].valueForKey("web_order_line_item_id") as? String
// ...
错误输出
fatal error: unexpectedly found nil while unwrapping an Optional value
当出现致命错误时,请标记此行
let info : NSArray = jsonResponse!.valueForKey("latest_receipt_info") as! NSArray
我试过了,但没有解决
还有我的json值
{
environment = Sandbox;
receipt = {
"adam_id" = 0;
"app_item_id" = 0;
"application_version" = "3.8";
"bundle_id" = "com.bla.bla";
"download_id" = 0;
"in_app" = (
{
"is_trial_period" = false;
"original_purchase_date" = "2016-02-18 15:56:23 Etc/GMT";
"original_purchase_date_ms" = 1455810983000;
"original_purchase_date_pst" = "2016-02-18 07:56:23 America/Los_Angeles";
"original_transaction_id" = 1000000194749934;
"product_id" = "com.bla.ShowMaps";
"purchase_date" = "2016-02-18 15:56:23 Etc/GMT";
"purchase_date_ms" = 1455810983000;
"purchase_date_pst" = "2016-02-18 07:56:23 America/Los_Angeles";
quantity = 1;
"transaction_id" = 1000000194749934;
},
{
"is_trial_period" = false;
"original_purchase_date" = "2016-02-18 15:58:37 Etc/GMT";
"original_purchase_date_ms" = 1455811117000;
"original_purchase_date_pst" = "2016-02-18 07:58:37 America/Los_Angeles";
"original_transaction_id" = 1000000194750377;
"product_id" = "com.bla.ApiSupport";
"purchase_date" = "2016-02-18 15:58:37 Etc/GMT";
"purchase_date_ms" = 1455811117000;
"purchase_date_pst" = "2016-02-18 07:58:37 America/Los_Angeles";
quantity = 1;
"transaction_id" = 1000000194750377;
},
{
"is_trial_period" = false;
"original_purchase_date" = "2016-02-18 17:13:03 Etc/GMT";
"original_purchase_date_ms" = 1455815583000;
"original_purchase_date_pst" = "2016-02-18 09:13:03 America/Los_Angeles";
"original_transaction_id" = 1000000194763153;
"product_id" = "com.bla.Limit";
"purchase_date" = "2016-02-18 17:13:03 Etc/GMT";
"purchase_date_ms" = 1455815583000;
"purchase_date_pst" = "2016-02-18 09:13:03 America/Los_Angeles";
quantity = 1;
"transaction_id" = 1000000194763153;
},
{
"is_trial_period" = false;
"original_purchase_date" = "2016-02-18 15:57:43 Etc/GMT";
"original_purchase_date_ms" = 1455811063000;
"original_purchase_date_pst" = "2016-02-18 07:57:43 America/Los_Angeles";
"original_transaction_id" = 1000000194750331;
"product_id" = "com.bla.BarcodeSupport";
"purchase_date" = "2016-02-18 15:57:43 Etc/GMT";
"purchase_date_ms" = 1455811063000;
"purchase_date_pst" = "2016-02-18 07:57:43 America/Los_Angeles";
quantity = 1;
"transaction_id" = 1000000194750331;
}
);
"original_application_version" = "1.0";
"original_purchase_date" = "2013-08-01 07:00:00 Etc/GMT";
"original_purchase_date_ms" = 1375340400000;
"original_purchase_date_pst" = "2013-08-01 00:00:00 America/Los_Angeles";
"receipt_creation_date" = "2016-02-18 17:13:03 Etc/GMT";
"receipt_creation_date_ms" = 1455815583000;
"receipt_creation_date_pst" = "2016-02-18 09:13:03 America/Los_Angeles";
"receipt_type" = ProductionSandbox;
"request_date" = "2016-02-18 17:13:05 Etc/GMT";
"request_date_ms" = 1455815585353;
"request_date_pst" = "2016-02-18 09:13:05 America/Los_Angeles";
"version_external_identifier" = 0;
};
status = 0;
}
如何进入json响应示例让product_id=mysender值?所以,
像这样
info = jsonResponse["receipt"]!["in_app"]
谢谢除了未指定的
JSON
结构之外,假设它不总是正确返回,您需要通过不隐式地展开JSON
对象来解释它。您还应该使用纯Swift数组,而不是NSArray
s,它们在需要时连接到Objective-C
在可能的情况下使用订阅也是一种很好的方式
if let jsonResponse = jsonResponse,
info = jsonResponse["latest_receipt_info"] {
// Makes sense to check if count > 0 if you're not sure, but...
let transaction_id = info[0]["transaction_id"] as? String
let web_order_line_item_id = info[0]["web_order_line_item_id"] as? String
// Do whatever else you need here
}
如果我正确理解了第二个问题,您可以通过解析数组和迭代对象来获得该值,从而获得product\u id
s,如下所示:
if let receipt = jsonResponse["receipt"],
info = receipt["in_app"] as? [Dictionary<String, AnyObject>] {
for object in info {
print(object["product_id"])
}
}
如果let receive=jsonResponse[“receive”],
信息=收据[“在应用程序中”]作为?[字典]{
对于信息中的对象{
打印(对象[“产品标识”])
}
}
…或者类似的东西,因为信息是一个对象数组。您可能需要根据自己的目的对此进行调整。除了未指定的
JSON
结构之外,假设它不总是正确返回,您需要通过不隐式地展开JSON
对象来解释它。您还应该使用纯Swift数组,而不是NSArray
s,它们在需要时连接到Objective-C
在可能的情况下使用订阅也是一种很好的方式
if let jsonResponse = jsonResponse,
info = jsonResponse["latest_receipt_info"] {
// Makes sense to check if count > 0 if you're not sure, but...
let transaction_id = info[0]["transaction_id"] as? String
let web_order_line_item_id = info[0]["web_order_line_item_id"] as? String
// Do whatever else you need here
}
如果我正确理解了第二个问题,您可以通过解析数组和迭代对象来获得该值,从而获得product\u id
s,如下所示:
if let receipt = jsonResponse["receipt"],
info = receipt["in_app"] as? [Dictionary<String, AnyObject>] {
for object in info {
print(object["product_id"])
}
}
如果let receive=jsonResponse[“receive”],
信息=收据[“在应用程序中”]作为?[字典]{
对于信息中的对象{
打印(对象[“产品标识”])
}
}
…或者类似的东西,因为信息是一个对象数组。您可能需要根据自己的目的对此进行调整。您的jsonResponse(或“最新收据信息”键)似乎为零。在这种情况下,您不能使用“!”因为这意味着你确信任何一个都不会为零。相反,在执行任何操作之前,首先检查它们是否存在。您的jsonResponse(或“最新收据信息”键)似乎为零。在这种情况下,您不能使用“!”因为这意味着你确信任何一个都不会为零。相反,在执行任何操作之前,首先检查它们是否存在。man我如何获取这些json值?我把代码加在下面了,我不知道你的意思。哪些值?我添加了我想要的json输出,例如:;我的product_id=“com.bla”等于信息行中对象所需的json输出值给出错误:“AnyObject”类型的值没有成员“Generator”,请尝试将信息转换为所需的数组类型。请参阅更新的答案以获取建议。我如何获取json值?我把代码加在下面了,我不知道你的意思。哪些值?我添加了我想要的json输出,例如:;我的product_id=“com.bla”等于信息行中对象所需的json输出值给出错误:“AnyObject”类型的值没有成员“Generator”,请尝试将信息转换为所需的数组类型。请参阅更新的答案以获取建议。我最近在尝试从laravel json服务器获取json数组时也有类似的经历。过了一会儿,我注意到有一些url值包含一些斜杠字母,并在后端对它们进行了编码,以防止json数组结构崩溃。我最近在尝试从laravel json服务器获取json数组时也有过类似的经历。过了一会儿,我们注意到一些url值包含一些斜杠字母,并在后端对它们进行了编码,以防止json数组结构崩溃。