我正在尝试为应用程序的演示构建JSON响应。我已经能够在Java for Android中构建,但无法将其转换为swift这是Java版本:
JSONObject response = new JSONObject("{'status': true, 'message':'success', 'data':[" +
"{'id':'ITM10001', 'area':'Regional', 'aboveRegion':'West', 'aboveScore':'7/10', 'belowRegion':'Lagos', 'belowScore':'4/10'}," +
"{'id':'ITM10002', 'area':'Area', 'aboveRegion':'V/Island', 'aboveScore':'8/10', 'belowRegion':'Ogba', 'belowScore':'3/10'}, " +
"{'id':'ITM10003', 'area':'Owned Restaurants', 'aboveRegion':'Yaba', 'aboveScore':'9/10', 'belowRegion':'Sabo', 'belowScore':'2/10'}, " +
"{'id':'ITM10004', 'area':'Franchised Restaurants', 'aboveRegion':'Idumota', 'aboveScore':'9/10', 'belowRegion':'Itafaji', 'belowScore':'3/10'}, " +
"{'id':'ITM10005', 'area':'Owned Restaurants', 'aboveRegion':'Mushin', 'aboveScore':'10/10', 'belowRegion':'Layi', 'belowScore':'2/10'}] }");
这就是我在swift中使用我在网上看到的代码JSONURL所做的,但仍然打印错误。任何帮助将不胜感激
let json = JSON.parse("{\"status\": true, \"message':\"success\", \"data\":[" +
"{\"status\": \"Approved\", \"paidDate\": \"Paid on 15 Aug 2015\", \"statusDate\": \"30 June 2015\", \"statusPrice\": \"5000\"}," +
"{\"status\": \"Rejected\", \"paidDate\": \"Paid on 15 Jun 2015\", \"statusDate\": \"30 May 2015\", \"statusPrice\": \"7000\"}," +
"{\"status\": \"Approved\", \"paidDate\": \"Paid on 15 July 2015\", \"statusDate\": \"30 June 2015\", \"statusPrice\": \"9000\"}," +
"{\"status\": \"Rejected\", \"paidDate\": \"Paid on 15 May 2015\", \"statusDate\": \"30 April 2015\", \"statusPrice\": \"8000\"} ]}")
答案 0 :(得分:3)
您不需要第三方库,可以使用NSJSONSerialization
。
另外,请注意所有引号都是双引号并被转义(在您的示例中,某个地方有一个引号应该是双引号)。
let str = "{\"status\": true, \"message\":\"success\", \"data\":[" + "{\"status\": \"Approved\", \"paidDate\": \"Paid on 15 Aug 2015\", \"statusDate\": \"30 June 2015\", \"statusPrice\": \"5000\"}," + "{\"status\": \"Rejected\", \"paidDate\": \"Paid on 15 Jun 2015\", \"statusDate\": \"30 May 2015\", \"statusPrice\": \"7000\"}," + "{\"status\": \"Approved\", \"paidDate\": \"Paid on 15 July 2015\", \"statusDate\": \"30 June 2015\", \"statusPrice\": \"9000\"}," + "{\"status\": \"Rejected\", \"paidDate\": \"Paid on 15 May 2015\", \"statusDate\": \"30 April 2015\", \"statusPrice\": \"8000\"}]}"
if let data = str.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false),
let jsonDict = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: nil) as? [String:AnyObject] {
println(jsonDict)
}
结果:
[状态:1,数据:( { paidDate =“2015年8月15日付款”; status =已批准; statusDate =“2015年6月30日”; statusPrice = 5000; }, { paidDate =“2015年6月15日付款”; status =被拒绝; statusDate =“2015年5月30日”; statusPrice = 7000; }, { paidDate =“2015年7月15日付款”; status =已批准; statusDate =“2015年6月30日”; statusPrice = 9000; }, { paidDate =“2015年5月15日付款”; status =被拒绝; statusDate =“2015年4月30日”; statusPrice = 8000; } ),消息:成功]
<强>更新强>
如果无法转换特定字符串,请检查错误:
var error:NSError?
if let data = str.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false),
let json = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &error) as? [String:AnyObject] {
if error == nil {
println(json)
} else {
println(error)
}
}
Swift 2.0更新
do {
if let data = str.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false),
let json = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? [String:AnyObject] {
print(json)
}
} catch let error as NSError {
print(error)
}
答案 1 :(得分:1)
来自Apple官方文档:
使用NSJSONSerialization类将JSON转换为Foundation对象并将Foundation对象转换为JSON。 可以转换为JSON的对象必须具有以下属性:
顶级对象是NSArray或NSDictionary。
所有对象都是NSString,NSNumber,NSArray,NSDictionary或NSNull的实例。
所有字典键都是NSString的实例。
数字不是NaN或无穷大。
这意味着您可以create a JSON Object from a Dictionary这样:
let dict = ["fruit": "orange", "chesse": "brie", "cars": ["bmw", "mercedes", "fiat"]]
if let data = NSJSONSerialization.dataWithJSONObject(dict, options: nil, error: nil)
{
let stringFromData = NSString(data: data, encoding: NSStringEncoding.allZeros)
println(stringFromData!)
// prints: "{"fruit":"orange","chesse":"brie","cars":["bmw","mercedes","fiat"]}"
}
答案 2 :(得分:0)
您永远不应该将JSON响应构建为字符串。它保证迟早会破裂。
您应该根据需要将JSON响应构建为字典或数组,然后使用NSJSONSerialization转换为NSData。除了调试目的,应该永远不会有一个字符串。