簡體   English   中英

在編譯時從 JSON 生成 Swift+Java 設置對象

[英]Generate Swift+Java settings object from JSON at compile time

我的移動應用程序有很多硬編碼數據,我想在應用程序的原生 Android 和 iOS 版本之間共享。 我不想為每個應用程序創建兩個設置文件:我希望有一個存儲信息的地方。

我的第一個想法是使用嵌入在我的應用程序中的 JSON 文件並在運行時對其進行解碼。

相反,我的目標是在編譯時反序列化應用程序的數據,以便:

  • 在發布應用程序之前跟蹤 JSON 文件或解碼代碼中的潛在錯誤:構建將失敗
  • 避免在啟動時被一些反序列化減慢
  • 避免將未加密的應用程序數據保留為 JSON 文件(.ipa/.apk 是可以輕松提取資源的 zip 文件),我寧願在代碼中對其進行混淆

我正在尋找一個命令行工具,我可以將它添加到我的構建腳本中,該腳本給定一個 JSON 文件,從而推斷出一個架構,從而推斷出類並使用所有應用程序設置實例化一個對象。

例如給定以下 settings.json 文件:

{
    "gravity": 9.81,
    "scientists": ["Kepler", "Einstein", "Newton"],
    "planets": [
        {
            "name": "Mars",
            "radius": 3390
        },
        {
            "name": "Venus",
            "radius": 6052
        }
    ]
}

我想自動生成一個 Settings.swift 文件,它可能如下所示:

struct Settings {

    struct Planet {
        var name: String
        var radius: Int
    }

    var gravity: Double
    var scientists: [String]
    var planets: [Planet]

    static func content() -> Settings {
        return Settings(gravity: 9.81, scientists: ["Kepler", "Einstein", "Newton"], planets: [Planet(name: "Mars", radius: 3390), Planet(name: "Venus", radius: 6052)])
    }
}

然后我可以將生成的文件包含到我的項目中並調用 Settings.content() 一次,將它保存在一個全局變量中並在我的整個項目中使用它。

我也想在 Android 上實現同樣的目標。

像 quicktype 或 json2swift 這樣的工具完成了一半的工作並且不生成對象實例化位,這仍然需要在運行時完成。

任何的想法?

我創建了一個開源 NodeJS mobile_app_data工具來實現我想要的。

可能的解決方案如下:

  1. 將 .json 文件保存在項目目錄中
  2. 在 AppDelegate applicationDidFinishLauncing() 中將上述文件讀入 Data 對象( 使用 Swift 3 讀取 JSON 文件
  3. 使您的 Settings 類實現可解碼(您的內部類 Planet 也需要實現可解碼)
  4. 調用 JsonDecoder().decode() 並提供您在 2) 中獲得的數據
  5. 然后您可以將此值保存在您想要的任何位置

我剛剛注意到,當 Settings.content() 被調用時,你需要這一代發生。 按照上述步驟將步驟 2) 移到 content() 函數中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM