NSDebugDescription = "JSON 文本没有以数组或对象开头,并且允许未设置片段的选项。";

Posted

技术标签:

【中文标题】NSDebugDescription = "JSON 文本没有以数组或对象开头,并且允许未设置片段的选项。";【英文标题】:NSDebugDescription = "JSON text did not start with array or object and option to allow fragments not set."; 【发布时间】:2013-03-17 00:37:29 【问题描述】:

我正在使用AFJSONRequestOperation 请求服务器并解析返回的 JSON 响应,但是在解析时,我收到了这个错误:

NSDebugDescription = "JSON text did not start with array or object and option to allow fragments not set.";

我检查了 API,它正在返回 JSON 数据:

header('Content-type: text/json');
$arr[] = array("Message" => "update succeeded");
echo '"Result":'.json_encode($arr).'';

知道如何解决这个问题吗?

编辑

我尝试从浏览器调用 API 并将请求包含在 url 中,因此我得到了有效的 JSON 响应:

"Result":["Message":"update succeeded"]

【问题讨论】:

能否把AFJSONRequestoperation收到的JSON字符串贴出来。 嗨,我在失败块中得到的 JSON 是(null) 你能在浏览器中运行 api 并包含对问题的响应吗? 是的,我已经这样做了,请看看我的编辑:) 我不懂 php,但你回显的整个内容不应该被包裹在 JSON_encode 中吗? 【参考方案1】:

首先,json_encode 整个对象,而不是分解成碎片。

其次,除非 $arr 包含多个元素(从上面的示例中不清楚),否则它应该这样初始化:

$arr = array("Message" => "update succeeded");

我仍然不确定这里还有什么问题。您应该回显您的应用正在接收什么,这应该表明问题。

【讨论】:

【参考方案2】:

请使用可接受的内容类型。 在您的网络服务中,这应该只是纯文本。

这是我的快速代码并已修复:

    let manager = AFHTTPRequestOperationManager()

    manager.requestSerializer=AFJSONRequestSerializer()
    manager.responseSerializer = AFHTTPResponseSerializer();

    manager.GET(

        baseURL + (webServiceType as String) + secureParam,
        parameters:[:],

        success:
         (operation: AFHTTPRequestOperation!,
            responseObject: AnyObject!) in
            completion(obj: responseObject)
        ,
        failure:
         (operation: AFHTTPRequestOperation!,
            error: NSError!) in
            completion(obj: nil)
    )

【讨论】:

【参考方案3】:

检查您是否在 API 的基本 URL 之前添加了 /api/,例如

http://someurl / yourBasrUrl /api/apiName

【讨论】:

【参考方案4】:

要做出有效的 json 响应,您的代码应该 看起来像这样:

$response = array(
    "Result" => array(
        "Message" => "update succeeded"
    )
)

echo json_encode($response);

【讨论】:

【参考方案5】:

如果您需要读取片段 json,您可以像这样使用选项.allowFragments

JSONSerialization.jsonObject(with: someData, options: .allowFragments)

【讨论】:

【参考方案6】:

请试试这个:

let manager = AFHTTPSessionManager(baseURL: NSURL("Base URL"))
manager.requestSerializer = AFJSONRequestSerializer()
manager.responseSerializer = AFJSONResponseSerializer()

 let params = [
    "foo": "bar"
]

manager.POST("API url", parameters: params, 

success: 
    (task: NSURLSessionDataTask!, responseObject: AnyObject!) in
        print("success") 
, 

failure: 
    (task: NSURLSessionDataTask!, error: NSError!) in
        print("error")
)

【讨论】:

【参考方案7】:

首先,您的 API 返回不正确的Content-Type。 JSON 数据的正确内容类型是 application/json。这在使用第三方库时可能会发生冲突。

其次,您不应该“手动”生成 json 字符串。一共要修改API面对:

header('Content-type: application/json');
$arr[] = array("Message" => "update succeeded");
echo json_encode(array('Result' => $arr));

最后一击并非最不重要。还有一件可能的事情:您的 api PHP 脚本的开头可能有 BOM 字符。这些是空格,因此您可能在浏览器中看不到它们。请ensure that your PHP files are encoded without BOM。

【讨论】:

以上是关于NSDebugDescription = "JSON 文本没有以数组或对象开头,并且允许未设置片段的选项。";的主要内容,如果未能解决你的问题,请参考以下文章

NSDebugDescription=字符 0 周围的值无效。- JSON 错误

iOS JSON 错误:NSDebugDescription=Garbage at end

Json 错误:错误域 = NSCocoaErrorDomain 代码 = 3840“无值”。 UserInfo=NSDebugDescription=无值。

如何修复“错误域 = NSCocoaErrorDomain 代码 = 3840”无价值。“UserInfo = NSDebugDescription = 无价值。”

NSDebugDescription = "JSON 文本没有以数组或对象开头,并且允许未设置片段的选项。";

错误:错误域 = NSCocoaErrorDomain 代码 = 3840“字符 0 周围的值无效。” UserInfo=NSDebugDescription=字符 0 周围的值无效。