ios - 如何在 JSON Swift iOS 中正确发送带有对象的数组
问题描述
您好,我是初学者,并试图了解如何发送带有对象的数组。服务器是否了解数组是什么样的 Int、Strings 或 Booleans?您是否必须以 JSON 字符串的形式发送数组?我不明白的是?
var productsResult = ""
let encoder = JSONEncoder()
let productObject = ProductUsed(name: "Custom name", reason: "This Reason", apply_way: "Intravenous infusion", dosing: "2x", date_start: "22-02-1999", date_end: "22-03-2003")
do {
let result = try encoder.encode([productObject])
if let resultString = String(data: result, encoding: .utf8) {
print(resultString)
productsResult = resultString
}
} catch {
print(error)
}
json["products_used"] = productsResult
我用这样的参数发送到服务器:
parameters: ["pregnancy_week": 0, "body_height": 198, "initials": "John Appleseed", "heavy_effect": false, "sex": "Male", "pregnancy": false, "month_of_birth": 3, "reaction": "No option checked", "additional_info": "Eeee", "products_used": "[{\"date_end\":\"22-03-2003\",\"dosing\":\"2x\",\"date_start\":\"22-02-1999\",\"apply_way\":\"Intravenous infusion\",\"name\":\"Custom name\",\"reason\":\"This Reason\"}]", "description": "Eeee", "result": "Recovery without lasting consequences", "year_of_birth": 1983, "day_of_birth": 11, "issue_date": "15-11-2020", "body_weight": 78]
但是在日志中打印了“resultString”并且看起来不错......
[{"date_end":"22-03-2003","dosing":"2x","date_start":"22-02-1999","apply_way":"Intravenous infusion","name":"Custom name","reason":"This Reason"}]
我的代码有什么问题,为什么“products_used”键中的单词之间有“\”?
解决方案
JSON 与 XML 不同,它不明确指定结构和类型。这意味着服务器必须知道预期的 JSON 数据。
在 JSON 中有一些值类型(https://www.w3schools.com/js/js_json_syntax.asp):
- 一个字符串
- 一个号码
- 数组
- 一个布尔值
- 无效的
- 一个 JSON 对象(带有类似标签的字典
{ "first" : "John", "last" : "Doe" }
)。这允许嵌套。
JSON 对象是一组标签-值对。标签和值由 分隔:
,对由 分隔,
。
数组是 JSON 值的列表。例如[ "hello", world" ]
,一个带有 2 个字符串[ 12, 54 ]
的 JSON 数组和一个带有两个数字的 JSON 数组。
您的参数列表["pregnancy_week": 0, "body_height": 198, ...
不是数组,而是字典。Swift 字典被转换为 JSON 对象,而不是 JSON 数组。
您看到的\
print 充当转义字符。此转义字符用于允许您"
在字符串中包含一个。
这只是我希望有助于更好地理解事情的几件事。您的问题非常基本,这很好,您想了解事物也很棒。但是,与其在这里解释所有内容,我认为您最好自己阅读一下 JSON 的结构以及 JSON 在 Swift 中的工作原理。
推荐阅读
- unity3d - Unity3d:找到哪个游戏对象在前面
- swift - 如何将本地网络名称从(例如 en0)更改为实际网络名称
- r - 在 r 中的数据帧的每一列中识别具有最大值的行
- powershell-5.0 - gwmi win32_service -ComputerName IP –credential userName 返回访问被拒绝但 Enter-PSSession -ComputerName IP -Credential Personal 有效
- javascript - 如何为使用 Flowplayer javascript API 嵌入的视频创建 onclick 事件?
- salesforce - 如何处理动作状态“未完成”
- r - 在公共 Y 轴上绘制 2 个折线图
- ballerina - Ballerina 找不到 JDK
- javascript - 如何实现 div 块高度的动态计算?
- sql - 如何根据两个不同表中的相反值编写 SQLite 查询?