【问题标题】:Swift Object Array to JSON -> POST -> PHP json_decode() to PHP Object ArraySwift 对象数组到 JSON -> POST -> PHP json_decode() 到 PHP 对象数组
【发布时间】:2017-04-03 17:25:03
【问题描述】:

我已经写了 swift/php/sql 3 个月了...(我知道我是一个菜鸟)。我可以创建简单的 POST 字符串并发出 http 请求...等
现在我正在尝试将多个对象推送到我的服务器以添加到我的数据库中。所以我认为传输对象的最佳方式是使用一个大的 json 字符串。也许不是... idk。我未能成功创建要发布的多对象 json 字符串。理想情况下,我想要一个 PHP json_decode($myJsonString) 将直接解码的字符串......我创建了一个游乐场用作测试用例。对 JSON(myPlaceArray) 的调用导致“未知”。
欢迎提出有关如何解决此问题或更简单方法的建议!谢谢!

import UIKit
import SwiftyJSON
class myClass {

  public struct Place {
    var PlaceId   = String()
    var name      = String()
    var address   = String()
    var latitude  = Double()
    var longitude = Double()
  }

}

var myPlaceArray = [myClass.Place()]
var myPlace = myClass.Place()

for i in 0..<3 {
  myPlace.PlaceId = "\(i)"
  myPlace.address = "My Address \(i)"
  myPlace.name = "My Name \(i)"
  myPlace.latitude = 37.123
  myPlace.longitude = -127.321
  if(i==0){
    myPlaceArray[0] = myPlace
  }
  else {
    myPlaceArray.append(myPlace)
  }
}
print(myPlaceArray[0])

let json = JSON(myPlaceArray)
print(json)  // results: "unknown"

let jsonMyPlaceArray = JSON(myPlaceArray)
print(jsonMyPlaceArray)

//setup json post data

//send HTTP POST
let myUrl = NSURL(string: "https://myUrl.php")
let request = NSMutableURLRequest(url: myUrl! as URL)
request.httpMethod = "POST"
let postString = "jsonPlaces=\(String(describing: jsonMyPlaceArray))"

print(postString)   // jsonPlaces=unknown

//.... make request

playground_image

【问题讨论】:

    标签: php arrays json swift post


    【解决方案1】:

    我发现 JSONUtils 非常有用: https://github.com/peheje/JsonSerializerSwift 您可以将消息建模为 Swift 类,然后使用此库将它们序列化。 这是一段代码,我在其中发布了一条包含文本数据和编码图像的 JSON 消息:

    类 TeamsSao : BaseSao {

    class func update ( request : TeamUpdateRequest, callback : @escaping (TeamUpdateResponse!) -> Void ) {
    
        var strUrl : String = getServiceUrl() + "/index.php"
        strUrl += "?avoid_cache=" + StringUtils.randomString (length: 24)
    
        let url: URL = URL(string: strUrl)!
    
        var urlRequest: URLRequest = URLRequest(url: url)
    
        urlRequest.httpMethod = "POST"
        urlRequest.timeoutInterval = 120000
        urlRequest.cachePolicy = .reloadIgnoringLocalCacheData
    
        urlRequest.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    
        urlRequest.setValue("application/json", forHTTPHeaderField: "Accept")
    
        let bodyStr:String = "msg=" + JSONUtils.toJson(request)//"pseudo=test"
        urlRequest.httpBody = bodyStr.data(using: String.Encoding.utf8)
    
        let session = URLSession.shared
    
        session.dataTask(with: urlRequest, completionHandler:
            {   (data, response, error) in
    
                //print(data)
                //print(response)
                //print(error)
    
                var result : TeamUpdateResponse!
    
                if (error == nil) {
                    if let httpResponse = response as? HTTPURLResponse {
                        if (httpResponse.statusCode < 200) || (httpResponse.statusCode >= 300) {
                            result  = TeamUpdateResponse()
                            result.status = TeamUpdateResponse.RESULT_EXCEPTION
                            result.errorDescription = "Response Status: \(httpResponse.statusCode)"
                        } else {
                            result = TeamUpdateParser.parse(data: data!)
                        }
                    }
    
                } else {
                    //print("A connection error occurred, here are the details:\n \(error)")
                    result  = TeamUpdateResponse()
                    result.status = TeamUpdateResponse.RESULT_EXCEPTION
                    result.errorDescription = error as! String!
                }
                callback (result)
        }
            ).resume()
    
    }
    

    }

    需要理解的几点:

    1. TeamUpdateRequest 是包含要发送的数据的类
    2. TeamUpdateResponse 是包含响应的类
    3. 使用 Swift 3,您应该使用回调函数。该方法接收一个回调函数,所以当post完成后,会解析响应,然后调用回调。

    【讨论】:

    • 谢谢沃尔特。我可以设置 url 请求并处理响应。我遇到的麻烦是将对象数组转换为可以作为参数发送到 POST 调用的 JSON 字符串。理想情况下,我想使用标准的 json_decode() php 函数直接在我的服务器上解码 JSON 字符串。
    • 再次感谢沃尔特。看起来这可能正是我想要的。我现在正在测试它。谢谢!
    • 不客气,这对我来说也非常适合使用 php 后端。
    • 序列化器工作得很好!现在看来,json 字符串在我的应用程序和服务器之间的某处被截断。我的 php json 字符串是 10K 字节。只有大约 1600 个字节通过网络传输。我正在调查这可能是我服务器上的 php 设置...
    • 原来我的 json 序列化字符串中有一个 & 被解释为一个新参数。我认为 UTF8 编码编码的 & 符号。 request.httpBody = postString.data(使用:String.Encoding.utf8)??我需要逃避安培吗? \& ?
    猜你喜欢
    • 2011-08-24
    • 2014-04-02
    • 2016-05-08
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多