无法将API响应转换为JSON,但它可以将其作为字符串打印

时间:2015-12-13 11:52:31

标签: json swift nsdata

我在将API的数据解析为Dictionary时遇到了一些问题。 我一直收到错误

Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.}

但如果我尝试使用此代码打印它:

if let s:NSString = String(data: data!, encoding: NSUTF8StringEncoding) {
     print(s)
}

它打印的内容如下:

({"user":{"id":4008257,"firstname":"FIRSTNAME","lastname":"LASTNAME","role":"ROLE"},"timetable":[[{"date":"2015-11-09","lessons":[{"id":42563,"title":"SUBJECT","location":"ROOM","acronym":"TEACHER","class":"CLASS","start":"2015-11-09T08:35:00+01:00","end":"2015-11-09T09:15:00+01:00","duration":2400,"eventType":"lesson"}, {"id":...}, ...]}, {"date":"...", ...}, ...]]})

要将数据解析为我使用的词典:

let dict:NSDictionary = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) as! NSDictionary

我现在已经坚持这个问题好几个小时了,我想我已经尝试了所有可能的变量类型组合和NSJSONReadingOptions

当我使用.MutableContainers而不是.AllowFragments时,我得到的错误是:

Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}

所以我添加了选项.AllowFragments。

我还检查了我能够打印的字符串是否是有效的JSON对象。我不得不删除它周围的(),但它是有效的。所以我询问提供数据的公司,如果他们犯了错误,但他们说一切正常。

有人能告诉我我做错了吗?

1 个答案:

答案 0 :(得分:0)

正如错误所说,“JSON文本没有以数组或对象开头” - JSON无效,这不是你的代码有问题。您可以通过将JSON粘贴到在线JSON阅读器(例如http://jsonlint.com - 这与iOS相同的内容来验证这一点。

如果JSON的提供者不会以其他格式提供它,则必须通过删除第一个和最后一个字符来清除代码中的字符。