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 周围的值无效。