【问题标题】:NSDebugDescription = "JSON text did not start with array or object and option to allow fragments not set.";NSDebugDescription = "JSON 文本没有以数组或对象开头,并且允许未设置片段的选项。";
【发布时间】: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 中吗?

标签: php ios afnetworking


【解决方案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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2016-03-01
                • 2018-07-07
                • 1970-01-01
                • 1970-01-01
                • 2018-05-21
                • 2014-01-06
                • 2016-06-04
                相关资源
                最近更新 更多