在Swift 4中将Json字符串转换为Json对象

Ind*_*ngh 34 ios swift

我尝试将JSON字符串转换为JSON对象,但JSONSerialization输出后是nilJSON.

响应字符串:

[{\"form_id\":3465,\"canonical_name\":\"df_SAWERQ\",\"form_name\":\"Activity 4 with Images\",\"form_desc\":null}]
Run Code Online (Sandbox Code Playgroud)

我尝试使用下面的代码转换此字符串:

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")
Run Code Online (Sandbox Code Playgroud)

Ami*_*mit 66

问题是你认为你的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)
}
Run Code Online (Sandbox Code Playgroud)

我得到了输出:

[["form_desc": <null>, "form_name": Activity 4 with Images, "canonical_name": df_SAWERQ, "form_id": 3465]]
Run Code Online (Sandbox Code Playgroud)

  • @Androidiseverythingforme :那是一个字典数组,试试`let form_name = jsonArray[0]["form_name"] as? String`,您将获得输出。 (2认同)

Pat*_*tru 17

使用JSONSerialization总是感觉不舒服和笨拙,但随着CodableSwift 4 的到来更是如此.如果你[String:Any]在一个简单的前面使用struct它将...伤害.在游乐场看看:

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)
}
Run Code Online (Sandbox Code Playgroud)

只需很少的努力处理,这将感觉更舒适.而且您将得到大量的详细信息,如果您的JSON不能正常解析.


Bha*_*Jam 8

我使用了下面的代码,它对我来说工作得很好。:

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)
         }
}
Run Code Online (Sandbox Code Playgroud)


Avi*_*Net 7

我在这里尝试解决方案,以及?[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)

        }
Run Code Online (Sandbox Code Playgroud)