【问题标题】:How to correctly send array with objects in JSON Swift iOS如何在 JSON Swift iOS 中正确发送带有对象的数组
【发布时间】:2021-02-27 01:31:13
【问题描述】:

您好,我是初学者,正在尝试了解如何发送包含对象的数组。服务器是否了解数组是什么样的 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["products_used"] = productsResult,所以你设置了一个字符串,所以你得到的是字符串化的JSON。 json 也不能是 Codable 吗?
  • @Larme 你是对的。如何将值传递给此参数?
  • 你为什么没有struct SomenameThatMakeSense { let pregnancyWeek: Int; bodyHeight: Int; initials: String; ... let productsUsed = [ProductUsed]; ...}
  • @Larme 我有 struct,我就像那里一样:link
  • @Larme 当我从没有 JSONEncoder() 的 Api 方法中发送带有对象的数组时,参数看起来像:"products_used": [testApp.ProductUsed(name: "Example", reason: "Some Test", apply_way: "Hmm Test", dosing: "Testable", date_start: "22-02-1998", date_end: "27-12-2010")],

标签: ios arrays json swift jsonencoder


【解决方案1】:

与 XML 不同,JSON 不明确指定结构和类型。这意味着服务器必须知道预期的 JSON 数据。

在 JSON 中有几种值类型 (https://www.w3schools.com/js/js_json_syntax.asp):

  • 一个字符串
  • 一个数字
  • 一个数组
  • 布尔值
  • 一个 JSON 对象(带有 { "first" : "John", "last" : "Doe" } 等标签的字典)。这允许嵌套。

JSON 对象是一组标签-值对。标记和值由: 分隔,对由, 分隔。

数组是 JSON 值的列表。例如[ "hello", world" ] 是一个包含 2 个字符串的 JSON 数组,[ 12, 54 ] 是一个包含两个数字的 JSON 数组。

您的参数列表["pregnancy_week": 0, "body_height": 198, ... 不是数组而是字典。 Swift 字典被转换为 JSON 对象,而不是 JSON 数组。

您看到打印的\ 充当escape character。此转义字符用于允许您在字符串中包含 "

这只是我希望有助于更好地理解事情的几件事。您的问题非常基本,这很好,您想了解事物也很棒。但是,与其在这里解释所有内容,我认为您最好自己阅读一下 JSON 的结构以及 JSON 在 Swift 中的工作原理。

【讨论】:

  • 感谢您的回答!这是一本好书,我重新阅读了所有关于 JSON 的内容。我知道这个参数列表不是数组 :) 我询问了“products_used”键中的数组。我仍然想知道如何将这个带有对象的“products_used”数组发送到没有转义字符的发布请求,或者如何正确地将这个数组发送到 url 参数?
猜你喜欢
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 2019-03-29
  • 1970-01-01
  • 2019-06-10
  • 1970-01-01
  • 2019-07-06
  • 2015-10-23
相关资源
最近更新 更多