首页 > 解决方案 > 如何在 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”键中的单词之间有“\”?

标签: iosarraysjsonswiftjsonencoder

解决方案


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 中的工作原理。


推荐阅读