【问题标题】:Need help preparing JSON in Swift from mixed sources for PHP需要帮助在 Swift 中从 PHP 的混合源中准备 JSON
【发布时间】:2016-09-24 21:09:01
【问题描述】:

我会尽量详细回答这个问题。

首先,我在代码中定义了以下结构:

struct LogInfo {
    var logNumber: Int
    var species: String
    var diameter: Float
    var formClass: Int
    var numLogs: Float
    var boardFootage: Double

    static func jsonArray(array : [LogInfo]) -> String {
        return "[" + array.map {$0.jsonRepresentation}.joinWithSeparator(",") + "]"
    }

    var jsonRepresentation : String {
        return "{\"logNumber\":\"\(logNumber)\",\"species\":\"\(species)\",\"diameter\":\"\(diameter)\",\"formClass\":\"\(formClass)\",\"numLogs\":\"\(boardFootage)\"}"
    }
}

这基本上创建了已定义结构的 JSON 表示。

在我的代码的另一部分,我正在用以下内容组成一个 JSON 字符串:

let sessionConfig = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession(configuration: sessionConfig, delegate: nil, delegateQueue: nil)

guard let URL = NSURL(string: "http://logster.dynamiscms.com/jsonTest.php") else {return}

let request = NSMutableURLRequest(URL: URL) 
request.HTTPMethod = "POST"

// Headers
request.addValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")


//Get the JSON Array from the Struct
let jsonArray = LogInfo.jsonArray(logArray)


// Compose the JSON Body
let bodyObject = [
    "propertyOwner": "\(propertyOwner)",
    "propertyID": "\(propertyID)",
    "scaledBy": "\(scaledBy)",
    "acres": "\(acres)",
    "notes": "\(notes)",
    "logDetails": jsonArray
]

到目前为止,所有内容基本上都需要 5 个变量,这些变量被传递到我的 segue,然后附加在结构中准备好的 JSON。

我想将我编译的 JSON 传递给 PHP 脚本,然后该脚本将解析该 JSON 并最终将其存储到数据库中。

我的代码没有出现任何错误 - 但 JSON 没有正确准备,这导致我无法在 PHP 中解析它。

基于此代码,我能够使用 PHP 解析前五个值(propertyOwner、propertyID、scaledBy、acres 和 notes)。但是,当我进入详细信息数组时,我无法进入那些嵌套值。

看起来当我将它传递到我的 PHP 脚本时,它会将其作为 JSON 吐出(我意识到这不是有效的 JSON):

[
    "notes": "This is a test.",
    "propertyID": "Beam Residence",
    "acres": "1",
    "scaledBy": "Andy Spencer",
    "propertyOwner": "Jim Beam",
    "logDetails": "
        {\"logNumber\":\"1\",\"species\":\"White Pine\",\"diameter\":\"18.0\",\"formClass\":\"78\",\"numLogs\":\"124.56227\"},

        {\"logNumber\":\"2\",\"species\":\"Hemlock\",\"diameter\":\"17.0\",\"formClass\":\"78\",\"numLogs\":\"147.0589725\"},

        {\"logNumber\":\"3\",\"species\":\"Spruce\",\"diameter\":\"21.0\",\"formClass\":\"82\",\"numLogs\":\"335.9106016\"}"

]

有人能帮我弄明白我缺少什么吗?

【问题讨论】:

    标签: php arrays json swift xcode


    【解决方案1】:

    一般情况下,您不应自己创建 JSON 字符串。需要对特殊字符进行转义,两端加"...,没那么简单。

    您不应该为中间值创建 JSON 的字符串表示形式。稍有错误,中间值被转换为单个 JSON 字符串。这是你的情况。

    (您的bodyData 可能会转换为有效的 JSON,但其中的 logDetails 会变成 PHP 中的单个字符串,这是您不希望的。)

    像这样更改jsonArray(_:)jsonRepresentation

    (如果您需要在其他地方使用返回 String 的那些方法和属性,请使用正确的名称重新实现它们。)

    static func jsonArray(array : [LogInfo]) -> [AnyObject] {
        return array.map{$0.jsonRepresentation}
    }
    
    var jsonRepresentation : [String: AnyObject] {
        return [
            "logNumber": logNumber, //<- or `String(logNumber)`
            "species": species,
            "diameter": diameter, //<- or `String(diameter)`
            "formClass": formClass, //<- or `String(formClass)`
            "numLogs": numLogs, //<- or `String(numLogs)`
            "boardFootage": boardFootage //<- or `String(boardFootage)`
        ]
    }
    

    (很多事情取决于你的PHP端。通常数值不会作为JSON字符串发送给PHP,但如果你的PHP代码需要它们作为字符串,你需要用String(...)将数值括起来。)

    让你的bodyObject:

    let jsonArray = LogInfo.jsonArray(logArray)
    
    let bodyObject: [String: AnyObject] = [
        "propertyOwner": propertyOwner,
        "propertyID": propertyID,
        "scaledBy": scaledBy,
        "acres": acres, //<- or `String(acres)`
        "notes": notes,
        "logDetails": jsonArray
    ]
    

    【讨论】:

    • 这成功了!非常感谢。你不知道这对我有多大帮助!
    【解决方案2】:

    基本上你有多个错误。这就是你最终想要的:

    {
        "notes":"This is a test.",
        "propertyID":"Beam Residence",
        "acres":"1",
        "scaledBy":"Andy Spencer",
        "propertyOwner":"Jim Beam",
        "logDetails":[
            {"logNumber":"1","species":"White Pine","diameter":"18.0","formClass":"78","numLogs":"124.56227"},
            {"logNumber":"2","species":"Hemlock","diameter":"17.0","formClass":"78","numLogs":"147.0589725"},
            {"logNumber":"3","species":"Spruce","diameter":"21.0","formClass":"82","numLogs":"335.9106016"}
        ]
    }
    

    你到达那里:

    1. 将环绕括号更改为 {}
    2. 将 \" 替换为 "
    3. 用 [] 而非 "" 包装 logDetails

    如果您需要代码方面的帮助,请告诉我。

    【讨论】:

      猜你喜欢
      • 2017-09-07
      • 2013-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-18
      • 2015-10-10
      • 1970-01-01
      相关资源
      最近更新 更多