JSON 解析 --> Swift | JSON 写入中的***类型无效

Posted

技术标签:

【中文标题】JSON 解析 --> Swift | JSON 写入中的***类型无效【英文标题】:JSON Parsing --> Swift | Invalid top-level type in JSON write 【发布时间】:2016-12-23 10:42:30 【问题描述】:

我正在尝试使用 Swift 从 php 文件中检索信息。我在网上看到我应该使用JSON解析(我认为它被称为)。所以我在网上搜索并找到了一些信息,导致我得到以下代码:

func dataOfJson(urlString: String) -> NSArray
    let url = NSURL(string: urlString);
    if (url != nil)
    
        let data = NSData(contentsOf: url as! URL);
        if (data != nil)
        
            return try! JSONSerialization.data(withJSONObject: data as Any) as AnyObject! as! NSArray;
        else
            //return "Error -> Data is nil!";
            return try! JSONSerialization.data(withJSONObject: data as Any) as AnyObject! as! NSArray;
        
    else
        return ["Error -> url is empty!"] as NSArray;
    

我这样调用上面的函数:print(dataOfJson(urlString: "some url/test.php"));

我调用的 URL 有以下 PHP 代码:

<?php   
header("Content-Type: application/json");
require "dbconnect.php";
global $connect;
$result = array();
$temp = array();

if ($connect)
    $fetch_data = mysqli_query($connect,"select * from dedi");

    while ( $row = $fetch_data->fetch_object() )
        $temp = $row;
        array_push($result,$temp);
    

    echo json_encode($result);
    return json_encode($result);

else
    echo json_encode("Something went wrong");
    return json_encode("Something went wrong!");    
 
mysqli_close(); ?>

遗憾的是,当我尝试运行该项目时,出现以下错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +[NSJSONSerialization dataWithJSONObject:options:error:]: Invalid top-level type in JSON write'

我完全不知道如何修复它,是的,我在网上搜索并发现了类似的解决方案问题,但我无法理解这些问题,并且一些修复并没有改变任何东西......

【问题讨论】:

1. MySQLi 连接永远不会关闭。 2. 不需要return json_encode(...);。您应该改为exit()。 3. 您应该为 JSON 数据使用适当的Content-Type,即header('Content-Type: application/json');。 4. 但是,问题的根源很可能在 Swift 代码的某个地方。 【参考方案1】:

documentation of NSJSONSerialization 说明了一些要求,您的 PHP 脚本中的 JSON 可能并不总是符合:

可以转换为 JSON 的对象必须具有以下内容 属性:

***对象是 NSArray 或 NSDictionary。 所有对象都是 NSString、NSNumber、NSArray、NSDictionary 或 NSNull 的实例。 所有字典键都是 NSString 的实例。 数字不是 NaN 或无穷大。

【讨论】:

我的PHP好像没问题,但是我觉得问题出在swift...上面我的swift有什么问题吗?

以上是关于JSON 解析 --> Swift | JSON 写入中的***类型无效的主要内容,如果未能解决你的问题,请参考以下文章

解析 JSON Swift 4

JS 对象到 Swift 结构

使用 Alamofire 在 swift 3 中解析 Json

无法在 Swift 中解析 JSON。 “应解码 Dictionary<String, Any>,但找到了一个数组。” [复制]

解析 JSON Swift 3 CTA 火车跟踪器

Swift 将 JSON 解析为模型对象