3
let str = "payload={'channel': '#bottest', 'username': 'garrettogrady', 'text': 'This post is coming from swift.'}"
    let strData = (str as NSString).dataUsingEncoding(NSUTF8StringEncoding)
    let cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData

    let url = NSURL(string: "web hook url (leaving it out for privacy reasons")

    var request = NSMutableURLRequest(URL: url!, cachePolicy: cachePolicy, timeoutInterval: 2.0)

    request.HTTPMethod = "POST"
    request.HTTPBody = strData
    println("printing to slack")
    var error : NSError? = nil
    if let data = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: &error) {
        let results = NSString(data:data, encoding:NSUTF8StringEncoding)
        println(results)
    }
    else
    {
        println("data invalid")
        println(error)
    }

したがって、このコードを実行してもエラーにはなりません。しかし、結果を印刷すると、「ペイロードは有効な JSON ではありませんでした」と表示されます

4

2 に答える 2

3

Slack は、JSON で二重引用符を想定しています。得られる結果は、Slack が現在形成されている JSON を拒否したことによるものです。

これは私自身のものからのコードです。これにより、さまざまなフィールドに変数値を組み込むことができます。とにかく、これが次のステップであると考えています。

let channel = "#bottest"
let username = "garrettogrady"
let text = "This post is coming from swift."
let payload = "payload={\"channel\": \"\(channel)\", \"username\": \"\(username!)\", \"text\": \"\(text)\""}"

編集: この質問は、Slack Webhook API を実装するオブジェクトを作成するきっかけになりました。興味のある方はこちら: https://github.com/pfj3/SwiftSlackbots

于 2015-05-12T20:50:24.777 に答える
1

これは、エラー メッセージに示されているように、JSON が有効でないためです。

JSON 文字列では、キーは二重引用符で囲む必要があります。辞書は で区切られ{}、配列は で区切られます[]。また、:ではなくを使用してください=

let str = "{\"payload\":{\"channel\": \"#bottest\", \"username\": \"garrettogrady\"}}"

JSON 文字列を使用してオブジェクトを作成することで、JSON 文字列が有効かどうかを確認できます。

if let strData = (str as NSString).dataUsingEncoding(NSUTF8StringEncoding) {
    var error: NSError?
    if let json = NSJSONSerialization.JSONObjectWithData(strData, options: NSJSONReadingOptions.allZeros, error: &error) as? [String:AnyObject] {
        println(json)
    }
}

出力されるのは、JSON コンテンツのオブジェクト表現です (構文はもちろん異なります。JSON 構文または Swift 構文と混同しないでください)。

["ペイロード": { channel = "#bottest"; ユーザー名 = garrettogrady; }]

次に、JSON 文字列を使用してオブジェクトを作成できたため、 JSON文字列を送信しても問題ないことを確認します。

于 2015-05-12T20:25:01.717 に答える