如何接收 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"
那么使用JSONSerialization
的jsonObject(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 字典?