Как генерировать swift класс или объект из XML или Json при сборке проекта в Xcode - PullRequest
0 голосов
/ 25 марта 2020

У меня есть файл json в следующем формате:

    {
    "id":"nav_grap",
    "startDestination":0,

    "navigators":[

        {
            "id":0,
            "groupsId":"0",
            "controller_name":"LoginScreen",
            "titleVi":"login_screen",
            "titleEn":"Dang nhap",
            "actions":[{
            "name":"idaction_loginScreen_to_homeScreen",
            "destination":1

            }]},
       {
            "id":1,
            "groupsId":"1",
            "controller_name":"HomeScreen",
            "titleVi":"Cong viec",
            "titleEn":"Jobs",
            "actions":[]
       },
       {
            "id":2,
            "groupsId":"2",
            "controller_name":"NewsScreen",
            "titleVi":"Tin tuc",
            "titleEn":"News",
            "actions":[]
       },
       {
            "id":3,
            "groupsId":"3",
            "controller_name":"BiometricsScreen",
            "titleVi":"Sin trac hoc",
            "titleEn":"News",
            "actions":[]
       },
       {
            "id":4,
            "groupsId":"4",
            "controller_name":"ContactScreen",
            "titleVi":"Tin tuc",
            "titleEn":"News",
            "actions":[]
       }]
}.       

Я хочу создать класс или объектную базу на основе формата этого файла json, когда я создаю свой проект после построенный проект У меня был бы объект со свойствами, подобными этому:

    class ScreenConfig : Decodable{

       var id : String
       var startDestination : Int
       var navigators : [Navigator] = []

       init(id : String, startDestination : Int, navigator : [Navigator]) {
          self.id = id
          self.startDestination = startDestination
          self.navigators = navigator
         }

       init() {
                self.id = ""
                self.startDestination = 0
                self.navigators = []
              }
      }.       

Итак, кто-нибудь может сказать мне, как я могу заархивировать это? спасибо.

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

Использование http://www.jsoncafe.com

struct TestingTest : Codable {

        let id : String?
        let navigators : [TestingNavigator]?
        let startDestination : Int?

        enum CodingKeys: String, CodingKey {
                case id = "id"
                case navigators = "navigators"
                case startDestination = "startDestination"
        }
        init(from decoder: Decoder) throws {
                let values = try decoder.container(keyedBy: CodingKeys.self)
                id = try values.decodeIfPresent(String.self, forKey: .id)
                navigators = try values.decodeIfPresent([TestingNavigator].self, forKey: .navigators)
                startDestination = try values.decodeIfPresent(Int.self, forKey: .startDestination)
        }
}


struct TestingNavigator : Codable {

        let actions : [AnyObject]?
        let controllerName : String?
        let groupsId : String?
        let id : Int?
        let titleEn : String?
        let titleVi : String?

        enum CodingKeys: String, CodingKey {
                case actions = "actions"
                case controllerName = "controller_name"
                case groupsId = "groupsId"
                case id = "id"
                case titleEn = "titleEn"
                case titleVi = "titleVi"
        }

        init(from decoder: Decoder) throws {
                let values = try decoder.container(keyedBy: CodingKeys.self)
                actions = try values.decodeIfPresent([AnyObject].self, forKey: .actions)
                controllerName = try values.decodeIfPresent(String.self, forKey: .controllerName)
                groupsId = try values.decodeIfPresent(String.self, forKey: .groupsId)
                id = try values.decodeIfPresent(Int.self, forKey: .id)
                titleEn = try values.decodeIfPresent(String.self, forKey: .titleEn)
                titleVi = try values.decodeIfPresent(String.self, forKey: .titleVi)
        }
}
0 голосов
/ 25 марта 2020

Вам нужно написать плагин Xcode для генерации JSON для кода Swift.

Таким образом, вы должны создать расширения для редактора исходного кода в Xcode, используя XcodeKit.

Расширения редактора исходного кода могут считывать и изменять содержимое исходного файла, а также считывать и изменять текущий выделенный текст в редакторе.


struct ScreenConfig: Decodable{

   let id : String
   let startDestination : Int
   let navigators : [Navigator]

}

struct Navigator: Decodable {
    let id: Int
    let groupsId: String
    let controller_name : String


    let titleVi: String
    let titleEn: String
    let actions: [Action]?

}



struct Action: Decodable {
    let name: String
    let destination: Int

}

Test Случай:

у вас есть файл json с именем "one. json" в вашем комплекте проекта, который настроен с вашими данными выше

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        if let src = Bundle.main.url(forResource: "one", withExtension: "json"){
            do {
                let data = try Data(contentsOf: src)
                let decoder = JSONDecoder()
                let model = try decoder.decode(ScreenConfig.self, from: data)
                print(model.navigators.first?.controller_name ?? "ha ha")

            } catch let error {
                print(error.localizedDescription)
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...