JSON文本不是从数组或对象和选项开始的,以允许未设置片段



我正在向我的iOS 7应用程序发送此请求的JSON响应。

{
 "root": {
    "success": "1",
    "message": "Successfully retrieved data.",
    "data": {
        "records": [
            {
                "receipt_key": "xxxxxxxx",
                "receipt_id": "xxxxxxxx",
                "store_name": "xxxxxx",
                "amount": "xxxx",
                "date_purchase": "xxxxxxxx",
                "is_processed": "x",
                "created_on": "xxxxxxxx",
                "modified_on": "xxxxxxxx",
                "modified_on_millis": "xxxxxxxx",
                "user_folder": "xxxxxxxx",
                "category_id": "xxxxxxxx",
                "is_deleted": "x",
                "currency_id": "xxxxxxxx"
            }
        ]
    }
}
}

我使用以下代码将上述JSON解析为nsdictionary对象。

 NSMutableDictionary *json=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];

,但是我在上述代码上遇到了此错误。

错误域= nscocoaerrordomain代码= 3840"操作不可能是 完全的。(可可错误3840。)"(JSON文本不是从数组开始或 允许未设置片段的对象和选项。)userInfo = 0x8a8a700 {nsdebugdescription = json文本不是从数组或对象开始的,并且 允许未设置片段的选项。}

我从PHP页面消费feed时遇到了相同的错误。就像您遇到的一样,由此产生的JSON字符串通过了视觉检查,但不会序列化。我的怀疑是饲料的某个地方有一个隐藏的字符,所以我将每个字符转换为其Unicode小数等效物,并检查了结果:

NSString *feedStr = [[NSString alloc] initWithData:feedData encoding:NSUTF8StringEncoding];
for(int i=0; i<[feedStr length]; ++i)
{
    unichar c = [feedStr characterAtIndex:i];
    NSLog(@"decimal char %d", c);
}

我发现在第一个角色之前,最后一个是字符#65279。经过快速的Google搜索,我发现了这是什么?65279,其中被确定为字节订单标记。

在我的情况下,我可以使用一个文本编辑器打开并保存所有包含的PHP文件来将其修复,该文本编辑器提供了一个选项,该选项可以使用"无BOM中的UTF-8中的Encode"编码。有关PHP侧的更多信息,请参阅如何避免在PHP中回波字符65279?

通常是因为从您的服务器上扔出的警告消息而不将其放入响应数组中。例如,在PHP中,一些"警告消息"不会在您的数组中捕获,因此当您最终使用" Echo JSON_ENCODE($ Response_arr)"时,它不是JSON格式。

您发布的JSON看起来还不错。如果那是您收到的iOS应用程序,它将被解析。即使没事,您也不会收到此错误消息。JSON必须以'['是数组,并且'{'是像您的字典,并且您收到的其他所有错误消息都必须从"数组"开始。因此,即使您发送了'[934KNSDF239] [@@@'您也不会收到此 this 错误消息,因为数据以[指示一个阵列开头。

您需要在iOS应用程序中进行调试。首先将数据转换为字符串并打印并进行检查。如果字符串看起来还不错,则打印数据本身 - 有时人们设法添加0个字节或控制字符,或两个字节订单标记或类似的字符串中不可见但不是合法JSON。

选项nsjsonreadingallowfragments允许仅由字符串,数字,布尔值或空值组成。除非您希望能够自己处理其中之一,否则不要使用它。

我面临同样的问题。但是我发现我作为访问服务器发送的URL是错误的。有一个小角色错误。例如,我正在发送以下URL

URL = https://somerUrl/api/v2/&venues/search?client_id=jkdasljf3242jka-fsdf-fadsfasd&lat=40.712488&long=-74.006277&distance=25

错误是额外的&amp;在遇到麻烦的场所前面的象征。所以我删除了&amp;符号并发现对我有用。因此,请确保您将正确的参数发送到服务器。

问题来自响应解析。您正在尝试去序列化JSON响应(必须包含在NSArrayNSDictionary中),但是您的响应不是上述内容(很可能是简单的字符串)。

您可以尝试打印出您的服务器响应。请在您的捕获块中使用代码。并在服务器端确定错误。

您的服务器数据是不正确的JSON格式,然后打印出您的服务器数据并检查服务器数据是否有效。

URLSession.shared.dataTask(with: url) { (data, response, error) in
        if let jsonData = data {
            do {
                let parsedData = try JSONSerialization.jsonObject(with: jsonData, options: .mutableLeaves) as! [String: AnyObject]
            }
            catch let err{
                print("nn===========Error===========")
                print("Error Code: (error!._code)")
                print("Error Messsage: (error!.localizedDescription)")
                if let data = data, let str = String(data: data, encoding: String.Encoding.utf8){
                    print("Server Error: " + str)
                }
                debugPrint(error)
                print("===========================nn")
                debugPrint(err)
            }
        }
        else {
            debugPrint(error as Any)
        }
    }.resume()

最新更新