如何在swift中创建特定的数据结构。 Swifty Json没用:(

时间:2014-12-21 15:22:13

标签: json api swift calendar google-calendar-api

我正在将我非常简单的应用程序从javascript(嵌入在应用程序中)移植到ios8 / swift和Xcode。 该应用程序将使用CalendarApiV3在Google日历中插入一些简单的事件。

在javascript中,很容易创建一个简单的数据结构来传递一个http POST请求,就像这样的结构:

var data:struct =
    {
        "end": {
            "dateTime": "20141223T12:25:00Z"
        },
        "start": {
            "dateTime": "20141223T10:25:00Z"
        },
        "summary": "description of event",
        "reminders": {
            "useDefault": false,
            "overrides": [
            {
            "method": "sms",
            "minutes": "60"
            },
            {
            "method": "email",
            "minutes": "60"
            }
            ]
        }
    };

好的,如何在Swift中重新创建一些结构? 我最终寻找了很好的json,但是他们都告诉我如何让json请求PARSE,而不是如何形成一个json请求。 我希望我很清楚。

提前致谢。

维克多

2 个答案:

答案 0 :(得分:4)

这是一个非常简单的示例,我假设没有人想要处理JSON字符串,他们希望从数据结构中创建它们。

var dict1 = ["dave": "drangle", "hume": "cronyn"]
var dict2 = ["bob": "fossil", "vince": "powers"]
var ary = [dict1, dict2]
var jsonData = JSON(ary)
var post:NSData = jsonData.rawData()!;
var postLength:NSString = String(post.length)

var url:NSURL = NSURL(string: "https://some.server.com/mobile.php")!
var request:NSMutableURLRequest = NSMutableURLRequest(URL: url)
request.HTTPMethod = "POST"
request.HTTPBody = post
request.setValue(postLength, forHTTPHeaderField: "Content-Length")
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.setValue("application/json", forHTTPHeaderField: "Accept")


if let data = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: nil) {
   println(data)
}

正如您所看到的,它是一个字典数组,然后转换为SwiftyJSON结构。 jsonData.rawData()!是什么让你获得NSData,这是request.HTTPBody所需的数据类型。以下是使用file_get_contents(" php:// input")和print_r(json_decode())在PHP服务器端看到的内容:

[{"hume":"cronyn","dave":"drangle"},{"bob":"fossil","vince":"powers"}]
Array
(
   [0] => stdClass Object
   (
       [hume] => cronyn
       [dave] => dangler
   )

   [1] => stdClass Object
   (
       [bob] => fossil
       [vince] => powers
   )

)

答案 1 :(得分:1)

SwiftyJSON非常适合在swift中从AnyObject构建JSON对象。

您可以查看有关如何从AnyObject创建JSON对象的网站。

拥有自己的JSON对象后,该网站实际上提到了如何创建可在HTTP请求中使用的JSON字符串。

if let string = json.rawString() {
    //Do HTTP Request here
}

这里cezar回答了很多关于如何在swift中使用HTTP请求:How to make an HTTP request in Swift?

<强>更新

所以我假设你有jsonString可用,你可以使用它来制作你的swiftyJSON对象

let data = jsonString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
let jsonObject = JSON(data: data!)