在String中构建JSON响应

时间:2015-08-01 11:45:43

标签: ios json swift

我正在尝试为应用程序的演示构建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\"} ]}")

3 个答案:

答案 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。除了调试目的,应该永远不会有一个字符串。