在编译时从 JSON 生成 Swift+Java 设置对象

Generate Swift+Java settings object from JSON at compile time

我的移动应用程序有很多硬编码数据,我想在本机 Android 和 iOS 版本的应用程序之间共享这些数据。 我不想为每个应用程序创建两个设置文件:我想要一个存储信息的地方。

我的第一个想法是使用嵌入我的应用程序的 JSON 文件并在运行时对其进行解码。

相反,我的目标是在编译时反序列化应用程序的数据,以便:

我正在寻找一个命令行工具,我可以将其添加到我的构建脚本中,给定一个 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 这样的工具完成了一半的工作并且不生成对象实例化位,这仍然需要在运行时完成。

有什么想法吗?

可能的解决方案如下:

  1. 保存项目目录下的.json文件
  2. 在 AppDelegate applicationDidFinishLauncing() 中将上述文件读入数据对象 ()
  3. 使您的设置 class 实现 Decodable(您的内部 class Planet 也需要实现 Decodable)
  4. 调用JsonDecoder().decode() 并提供您在2)中获得的数据
  5. 然后您可以将此值保存在任何您想要的地方

我刚刚注意到您需要在调用 Settings.content() 时生成 happy。按照上面的步骤只是将步骤2)移到content()函数中

我创建了一个开源 NodeJS mobile_app_data 工具来实现我想要的。