如何映射 json 响应并创建带有索引的简单列表

Posted

技术标签:

【中文标题】如何映射 json 响应并创建带有索引的简单列表【英文标题】:How to map json response and create simple list with indexes 【发布时间】:2017-11-01 19:44:30 【问题描述】:

我正在获取成分,从响应中准备值,并且我希望此文本在屏幕上显示时呈现中断、破折号和指针。我怎样才能做到这一点?

if let ingredients = dict["ingredients"] as? Array<String> 
                    self._ingredients = ingredients.joined(separator: " \n - ")

这有效,但不适用于数组中的第一个元素。

4 elements
- 0 : "3 glasses of flour"
- 1 : "1 spoon of salt"
- 2 : "spices"
- 3 : "1 glass of hot water"

我想让它在 ViewController 的标签上显示,如下所示:

 - 3 glasses of flour
 - 1 spoon of salt
 - spices
 - 1 glass of hot water

为了准备我想添加适当的数字指针:

if let preparing = dict["preparing"] as? Array<String> 
                    self._preparing = preparing.joined(separator: "\n")
3 elements
 - 0 : "Mix dry ingredients."
 - 1 : "Add hot water, oil, sugar to yeast."
 - 2 : "When it's ready add this to flour and start combining"

所以它在标签中看起来像这样:

1. Mix dry ingredients
2. Add hot water, oil and sugar to yeast
3. When it's ready add this to flour and start combining

其他信息 Screen 目前的外观(不要介意语言,它是波兰语)。

在这个 Controller 的生命周期中,我做了简单的 updateUI

func updateUI () 
    pizzaDesc.text = pizza.description
    ingredientsDesc.text = pizza.ingredients
    PreparingDesc.text = pizza.preparings
    titleLbl.text = pizza.title


 //MARK: Lifecycle

override func viewDidLoad() 
    super.viewDidLoad()

   hideTestDataOnLoad()
   pizza = PizzaRecipe()
   pizza.downloadRecipeDetails 
        self.updateUI()
    

【问题讨论】:

你能发一张它目前看起来的屏幕截图吗?目前的状态有点模棱两可。您还可以发布生成您分配给标签的全文的代码吗? @Frankie 我已经用其他信息和图片更新了我的问题。我会尝试用已经给出的答案来解决这个问题。 【参考方案1】:

用这个dict测试:

let jsonText = """

    "ingredients": [
        "3 glasses of flour",
        "1 spoon of salt",
        "spices",
        "1 glass of hot water"
    ],
    "preparing": [
        "Mix dry ingredients.",
        "Add hot water, oil, sugar to yeast.",
        "When it's ready add this to flour and start combining"
    ]

"""
let dict = try! JSONSerialization.jsonObject(with: jsonText.data(using:.utf8)!) as! [String: Any]

案例 1:- 可能不是 separator

    if let ingredients = dict["ingredients"] as? Array<String> 
        self._ingredients = ingredients.map" - \($0)".joined(separator: "\n")
        //...
    

案例 2:您可以使用 enumerated() 获取与每个元素配对的元素索引。

    if let preparing = dict["preparing"] as? Array<String> 
        self._preparing = preparing.enumerated().map"\($0+1). \($1)".joined(separator: "\n")
        //...
    

【讨论】:

【参考方案2】:

所以这令人困惑的原因是您实际上要在这里完成两件不同的事情:

    您想在每种成分前加上一个破折号(- 3 个鸡蛋) 您希望数组中的每一项都位于不同的行中

您遇到的问题是 joined 仅适用于数组中的 BETWEEN 项目,而不适用于每个项目。您需要使用 .map() 对数组中的每个项目执行某些操作(将其视为 for 循环)。

所以你会这样实现:

let prefixed = ingredients.map() "- " + $0
let joined = prefixed.joined(separator: " \n")
label.text = joined

【讨论】:

以上是关于如何映射 json 响应并创建带有索引的简单列表的主要内容,如果未能解决你的问题,请参考以下文章

带有 django 的 Json 响应列表

使用 RESTKit 映射带有括号的 JSON 响应

按索引映射两个数组

restkit 映射嵌套数组为空(带有 json 响应的嵌套 restkit 请求)

将 Json 响应中的对象列表映射到颤动中的列表

带有索引列表的 R tibble:如何快速使用它们?