簡體   English   中英

在 Swift 4 中將 Json 字符串轉換為 Json 對象

[英]Convert Json string to Json object in Swift 4

我嘗試將 JSON 字符串轉換為 JSON 對象,但在JSONSerialization之后,JSON 中的輸出nil

響應字符串:

[{\"form_id\":3465,\"canonical_name\":\"df_SAWERQ\",\"form_name\":\"Activity 4 with Images\",\"form_desc\":null}]

我嘗試使用下面的代碼轉換此字符串:

let jsonString = response.result.value
let data: Data? = jsonString?.data(using: .utf8)
let json = (try? JSONSerialization.jsonObject(with: data, options: [])) as? [String:AnyObject]
 print(json ?? "Empty Data")

問題是你認為你的 jsonString 是一本字典。 不是。

這是一個字典數組 在原始 json 字符串中,數組以[開頭,字典以{開頭。


我將您的 json 字符串與以下代碼一起使用:

let string = "[{\"form_id\":3465,\"canonical_name\":\"df_SAWERQ\",\"form_name\":\"Activity 4 with Images\",\"form_desc\":null}]"
let data = string.data(using: .utf8)!
do {
    if let jsonArray = try JSONSerialization.jsonObject(with: data, options : .allowFragments) as? [Dictionary<String,Any>]
    {
       print(jsonArray) // use the json here     
    } else {
        print("bad json")
    }
} catch let error as NSError {
    print(error)
}

我得到了輸出:

[["form_desc": <null>, "form_name": Activity 4 with Images, "canonical_name": df_SAWERQ, "form_id": 3465]]

使用JSONSerialization總是JSONSerialization覺得笨拙和笨拙,但隨着 Swift 4 中Codable的到來Codable 。如果你在一個簡單的struct前使用[String:Any] ,它會......傷害。 在操場上看看這個:

import Cocoa

let data = "[{\"form_id\":3465,\"canonical_name\":\"df_SAWERQ\",\"form_name\":\"Activity 4 with Images\",\"form_desc\":null}]".data(using: .utf8)!

struct Form: Codable {
    let id: Int
    let name: String
    let description: String?

    private enum CodingKeys: String, CodingKey {
        case id = "form_id"
        case name = "form_name"
        case description = "form_desc"
    }
}

do {
    let f = try JSONDecoder().decode([Form].self, from: data)
    print(f)
    print(f[0])
} catch {
    print(error)
}

用最少的努力處理這會感覺更舒服。 如果您的 JSON 解析不正確您將獲得更多信息。

我在這里嘗試了解決方案,作為? [String:AnyObject]為我工作:

do{
    if let json = stringToParse.data(using: String.Encoding.utf8){
        if let jsonData = try JSONSerialization.jsonObject(with: json, options: .allowFragments) as? [String:AnyObject]{
            let id = jsonData["id"] as! String
            ...
        }
    }
}catch {
    print(error.localizedDescription)

}

我使用了下面的代碼,它對我來說很好用。

let jsonText = "{\"userName\":\"Bhavsang\"}"
var dictonary:NSDictionary?
    
if let data = jsonText.dataUsingEncoding(NSUTF8StringEncoding) {
        
     do {
            dictonary =  try NSJSONSerialization.JSONObjectWithData(data, options: [.allowFragments]) as? [String:AnyObject]
        
            if let myDictionary = dictonary
              {
                  print(" User name is: \(myDictionary["userName"]!)")
              }
            } catch let error as NSError {
            
            print(error)
         }
}

這對我有用

func convertToDictionary(text: String) -> [String: Any]? {
if let data = text.data(using: .utf8) {
    do {
        return try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
    } catch {
        print(error.localizedDescription)
    }
}
return nil

}

let str =“ {\\” name \\“:\\” James \\“}”

讓dict = convertToDictionary(text:str)

static func getJSONStringFromObject(object: Any?) -> String? {
    do {
        let jsonData = try JSONSerialization.data(withJSONObject: object ?? DUMMY_STRING, options: [])
        return String(data: jsonData, encoding: .utf8) ?? DUMMY_STRING
    } catch {
        print(error.localizedDescription)
    }
    return DUMMY_STRING
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM