如何接收 json 字符串并将其转换为字典?

Posted

技术标签:

【中文标题】如何接收 json 字符串并将其转换为字典?【英文标题】:How to receive a json string and convert that into Dictionary? 【发布时间】:2020-09-04 11:57:15 【问题描述】:

我在下面粘贴了一个 JSON


    "name" :
    
        "id" : "name",
        "label" : "name field",
        "disabled" : false,
        "display" : true,
        "pattern" : "^\\+(?:[0-9] ?)6,14[0-9]$",
        "type" : "text"
    ,
     "age" :
   
    "id" : "age",
    "label" : "age",
    "disabled" : false,
    "display" : true,
    "pattern" : "^\\+(?:[0-9] ?)6,14[0-9]$",
    "type" : "text"
   

我需要将此 JSON 字符串传递到我的方法中,并将其转换为 Dictionary 类型的 Dictionary Dictionary<String,Dictionary<String,Any>>

为此,我首先尝试在传递给方法之前验证 JSON 字符串,但它总是说无效 json

let jsonData = json.data(using: String.Encoding.utf8)

   if JSONSerialization.isValidJSONObject(jsonData) 
       print("Valid Json")
    else 
       print("InValid Json")
   

知道为什么这个 JSON 字符串总是返回无效 json?

我在操场上试过这个,请查看截图 enter image description here

【问题讨论】:

developer.apple.com/documentation/foundation/jsondecoder 这个只适用于普通字典,不适用于动态嵌套字典 dynamic nested one 是什么? like name age 可能会有n个keys会来 您可以创建一个struct 来映射所有内部 json 对象。否则,你可以试试 raw JSONSerialization.jsonObject: hackingwithswift.com/example-code/system/… 【参考方案1】:

您正在检查数据为 isValidJsonObject,这就是它给出无效 json 的原因。 您应该尝试将数据转换为 jsonObject,然后检查 isValidJsonObject

我尝试如下,它给出了有效的 json

 let jsonData = try! JSONSerialization.data(withJSONObject: json, options: [])

 let jsonObject = try!JSONSerialization.jsonObject(with: jsonData, options: [])

 if JSONSerialization.isValidJSONObject(test) 
               print("Valid Json")
   else 
               print("InValid Json")
  

【讨论】:

【参考方案2】:

您需要对pattern 属性中的两个escape 字符进行转义,以通过JSONSerialization 的验证检查:


  "name": 
    "id": "name",
    "label": "name field",
    "disabled": false,
    "display": true,
    "pattern": "^\\\\+(?:[0-9] ?)6,14[0-9]$",
    "type": "text"
  ,
  "age": 
    "id": "age",
    "label": "age",
    "disabled": false,
    "display": true,
    "pattern": "^\\\\+(?:[0-9] ?)6,14[0-9]$",
    "type": "text"
  

那么使用JSONSerializationjsonObject(with:options:)函数不会报错:

do 
    if let dict = try JSONSerialization.jsonObject(with: Data(jsonString.utf8)) as? [String: Any] 
        print(dict)
    
 catch 
    print(error)

更新:更好的是,您可以使用Codable 协议来创建模型结构:

struct Response: Codable 
    var name: Name
    var age: Age


struct Name: Codable 
    var id: String
    var label: String
    var disabled: Bool
    var display: Bool
    var pattern: String
    var type: String


struct Age: Codable 
    var id: String
    var label: String
    var disabled: Bool
    var display: Bool
    var pattern: String
    var type: String

并使用JSONDecoder 将您的 JSON 直接映射到该模型:

let decoder = JSONDecoder()

do 
    let decoded = try decoder.decode(Response.self, from: Data(jsonString.utf8))
    print(decoded)
 catch 
    print(error)

【讨论】:

【参考方案3】:

您可以像这样快速完成简单的操作。可以使用 https://app.quicktype.io/ 之类的 Web App 将 JSON 转换为 swift 结构 :)

import Foundation

// MARK: - NameAge
struct NameAge: Codable 
    let name, age: Age


// MARK: - Age
struct Age: Codable 
    let id, label: String
    let disabled, display: Bool
    let pattern, type: String


let JSON = """

    "name" :
    
        "id" : "name",
        "label" : "name field",
        "disabled" : false,
        "display" : true,
        "pattern" : "^\\+(?:[0-9] ?)6,14[0-9]$",
        "type" : "text"
    ,
     "age" :
   
    "id" : "age",
    "label" : "age",
    "disabled" : false,
    "display" : true,
    "pattern" : "^\\+(?:[0-9] ?)6,14[0-9]$",
    "type" : "text"
   

"""
let jsonData = JSON.data(using: .utf8)!
let nameAge = try? newJSONDecoder().decode(NameAge.self, from: jsonData)

【讨论】:

以上是关于如何接收 json 字符串并将其转换为字典?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 中将 Http Post 参数的 Json 值转换为 Python 字典?

如何将 JSON 字符串转换为数组

将 Swift 3 数组转换为 JSON

在 Rails 中将 JSON 字符串转换为 JSON 对象

pythhon_如何读取json数据

如何将afnetworking json字典转换为字符串,然后在IOS中将字符串转换为字典?