Swift 5 — JSONEncoder с вложенным JSON

#ios #json #swift #iphone

Вопрос:

Я пытаюсь закодировать a [[String : String]] во вложенные объекты JSON с JSONEncoder() помощью .

Пример быстрого вывода:

 [["firstName": "John", "lastName": "Doe"], ["firstName": "Tim", "lastName": "Cook"]]  

Предполагаемый вывод JSON после кодирования:

 [  {  "firstName": "John",  "lastName": "Doe"  },   {  "firstName": "Tim",  "lastName": "Cook"  } ]  

Как бы я прошелся по этому массиву словарей, а затем закодировал его с JSONEncoder().encode() помощью ? Большое спасибо!

Ответ №1:

JSONEncoder дает вам Data по умолчанию. Чтобы вернуть его в String форму, вы можете использовать это:

 let input = [["firstName": "John", "lastName": "Doe"], ["firstName": "Tim", "lastName": "Cook"]]  do {  let json = try JSONEncoder().encode(input)  print(String(decoding: json, as: UTF8.self)) } catch {  print(error) }  

Что дает:

[{«firstName»:»John»,»lastName»:»Doe»},{«firstName»:»Tim»,»lastName»:»Cook»}]

Ответ №2:

Используется Codable для кодирования/декодирования данных JSON. Во-первых, преобразуйте JSON в подобный объект, это упростит задачу, если вы добавите больше полей:

 struct Person: Codable {  var firstName: String  var lastName: String }  

Предположим, что у вас есть Person массив

 var persons = [Person]() persons.append(.init(firstName: "John", lastName: "Doe")) persons.append(.init(firstName: "Tim", lastName: "Cook"))  //PRINT OUT let jsonData = try! JSONEncoder().encode(persons) let jsonString = String(data: jsonData, encoding: .utf8)  

И это результат:

«[{«firstName»:»John»,»lastName»:»Doe»},{«firstName»:»Tim»,»lastName»:»Cook»}]»