конвертировать Codable в Json (словарь) Swift - PullRequest
0 голосов
/ 31 октября 2019

Как я могу преобразовать Codable в Json Dictionay, это вложенная структура

struct one

struct User: Codable {
    var name = "siddhant"
    var age = 12
    var topInt = ["1","2","3"]
    var moreDetails = MoreDetails()
}

struct Two

struct MoreDetails: Codable {
    var image = "ImageUrl"
}

Мне нужно поставить как Jsonкогда я конвертирую это в Json, он просто конвертирует меня в struct, а не в 2-й struct

   do {
        let sid = try JSONEncoder().encode(users)

        let dict = try JSONSerialization.jsonObject(with: sid, options: []) as? [String: Any]


        print(dict)
    }
    catch {
        print(error)
    }

токовый вывод, который является неправильным:

(["name": siddhant, "topInt": <__NSArrayI 0x2831a1c20>(1,2,3),           
"moreDetails": {
image = ImageUrl;
}, "age": 12])

Я хочу выводить как

{
"name": "siddhant",
"topInt": ["1", "2", "3"],
"moreDetails": {
    "image": "ImageUrl"
},
"age": 12
}

Ответы [ 3 ]

1 голос
/ 01 ноября 2019

То, что я сделал сейчас, это

let users = User()

let staticJson = ["name": users.name,
              "age": users.age,
              "topInt": users.topInt,
              "moreDetails": ["image": users.moreDetails.image]] as? [String: Any]
0 голосов
/ 31 октября 2019

Вам необходимо указать желаемый результат. Следующий код:

    struct User: Codable {
    var name = "siddhant"
    var age = 12
    var topInt = ["1","2","3"]
  var moreDetails = MoreDetails()


  var dictionaryJson: [String : Any] {
    let encoder = JSONEncoder()
    return (try? JSONSerialization.jsonObject(with: encoder.encode(self), options: .allowFragments)) as? [String: Any] ?? [:]
  }

}

struct MoreDetails: Codable {
    var image = "ImageUrl"
}

do {

  let users = User()
  let jsonData = try JSONEncoder().encode(users)
  let jsonString = String(data: jsonData, encoding: .utf8)!

  print(jsonString)
  print("\n")
  print(users.dictionaryJson)

  print("\n")
  print("Getting the var from dictionary")
  print(users.dictionaryJson["moreDetails"])
} catch {
  print(error)
}

Вывод:

    {"age":12,"moreDetails":{"image":"ImageUrl"},"name":"siddhant","topInt":["1","2","3"]}


["topInt": <__NSArrayI 0x6000008e8150>(
1,
2,
3
)
, "name": siddhant, "age": 12, "moreDetails": {
    image = ImageUrl;
}]


Getting the var from dictionary
Optional({
    image = ImageUrl;
})
0 голосов
/ 31 октября 2019

Вы можете создать расширение для Encodable, чтобы вы могли использовать его для всех элементов, которые соответствуют протоколу Encodable

extension Encodable {

  var dictionary: [String: Any]? {
    guard let data = try? JSONEncoder().encode(self) else { return nil }
    return (try? JSONSerialization.jsonObject(with: data, options: .allowFragments)).flatMap { $0 as? [String: Any] }
  }

}

В вашем случае, если модель user типа User

guard let userDict = user.dictionary else { return }
...