2016-09-24 32 views
0

我會盡量使這個問題儘可能徹底。需要幫助準備從PHP的混合來源準備JSON的JSON

開始,在我的代碼,我有以下結構定義:

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 
] 

一切到這一點基本上採用的是被傳遞到我的SEGUE 5個變量,然後追加的JSON在結構中準備好了。

我想將我編譯的JSON傳遞給PHP腳本,然後解析該JSON並最終將其存儲到數據庫中。

我沒有在我的代碼中發現任何錯誤 - 但是JSON沒有正確地準備好,這導致我無法通過PHP解析它。

基於這段代碼,我能夠用PHP解析前五個值(propertyOwner,propertyID,scaledBy,英畝和註釋)。但是,當我進入細節數組時,我無法進入這些嵌套值。

看來,當我將它傳遞到我的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\"}" 

] 

是任何人能幫助我意義我錯過了什麼?

回答

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端。通常數值AR E不被作爲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 
] 
+0

這有竅門!非常感謝。你不知道這實際上對我有多大幫助! –

0

基本上你已經有多個錯誤。這裏是你到底想要什麼:

{ 
    "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 []而不是「」

讓我知道你是否需要幫助的代碼。