在 Elm 应用程序中使用静态数据:解析 JSON 还是使用 Elm 值?
Using static data in Elm applications: parse JSON or use Elm values?
我即将开始开发主要用于显示数据集的 Elm 应用程序。数据将在几个 JSON 文件(包括不同的文本语言)中准备,由 JSON 模式指定。该数据库不会消失,因为存在共享数据集的其他用例。
我现在看到从 Elm 访问这些数据的两个选项。
在运行时检索和解析 JSON
使用 json-schema-to-elm 或类似的方法,我可以从我拥有的模式生成数据类型和解析器。然后,在运行时,我加载应用程序需要的 JSON 并解析它。
优势
- 始终使用当前数据,无需额外工作。
- 应用程序大小不会因数据而膨胀。
缺点
- JSON 检索的运行时影响。
- JSON 解析的运行时影响。
- 数据必须存储在模型中。
在编译时将 JSON 转换为 Elm 值
使用手写编译器(可能基于 json-schema-to-elm 生成的类型),我可以将 JSON 数据静态转换为 Elm 代码。因此,数据随应用程序一起提供,并且可以使用 Elm 原语进行访问。
优势
- 直接访问数据,无运行时影响。
- 数据未存储在模型中。
缺点
- 当数据改变时需要重新编译应用程序。
- 应用程序很大,因为需要包含所有数据。
权衡
根据以上列表,这是我的结论。
- 我希望数据很少更改(在开始的管理期之后)。重新编译和部署应用程序应该很简单;不会有任何需要小心的外部交互。
- 该应用程序应该在移动设置中使用,因此节省网络请求和处理器负载是一件好事。
- 我想要一个独立版本供离线使用,所以拥有一个整体甚至可能会有帮助。
- 实际数据集不会太大;我估计最多也就几百千字节,包括所有语言。
因此,我认为在我的情况下使用预编译的 Elm 值是更好的解决方案。
我的问题是:我是否遗漏了这两种方法中可能影响我权衡取舍的任何方面?我应该考虑其他方法吗?
请注意,我现在并不担心具体的工具;这更像是一个概念性的设计问题。
巩固以上评论中的对话:
您提到的两个包,json-schema-to-elm
和 json-to-elm
的输出大致相似。它们都呈现包含类型、解码器和编码器的 Elm 源代码。
主要区别在于它们的输入:
json-schema-to-elm
将 JSON Schema 作为输入。当您的 JSON 变得比示例描述的更复杂时,这很有用,但它还需要您为所有要建模的 JSON 编写一个模式文件。
json-to-elm
将示例 JSON 值作为输入。这在您的 JSON 模型相对简单时很有用。
就我个人而言,我会尝试编写一些概念证明,看看是否真的存在任何有害的运行时低效问题。您始终可以将 json 值作为字符串保留在 .elm 文件中 - 这将简化离线访问,避免网络流量,而且真正唯一的缺点是每个 json 输入的每个值解码一次,因为如果它没有改变,你将不需要再次解码它。
注意:如果您采用将 json 作为字符串值嵌入 .elm 文件的方式,请注意 multi-line string syntax 这将有助于避免原始 [=38= 中的大量转义字符] 字符串
这是一个想法。
- 使用
json-schema-to-elm
生成类型和解码器。
- 在 Elm 应用程序中,加载 JSON 数据。
- 使用
toString
并将结果写入文件。
- 修复结果中的任何问题,使其成为真正的源文件。
根据documentation,结果toString
should look just like the value it came from.
此方法的功效取决于:
- 如何很好地集成工作流:
json-schema-to-elm
是一个 Elixir 应用程序,而 Elm 并不是真正可编写脚本的。
json-schema-to-elm
对您的架构的支持程度。
在我的例子中,json-schema-to-elm
不接受该架构(错误消息不多),而且它似乎根本不支持 patternProperties
(可能还有 [= 的其他功能) 43=] 模式)。
我即将开始开发主要用于显示数据集的 Elm 应用程序。数据将在几个 JSON 文件(包括不同的文本语言)中准备,由 JSON 模式指定。该数据库不会消失,因为存在共享数据集的其他用例。
我现在看到从 Elm 访问这些数据的两个选项。
在运行时检索和解析 JSON
使用 json-schema-to-elm 或类似的方法,我可以从我拥有的模式生成数据类型和解析器。然后,在运行时,我加载应用程序需要的 JSON 并解析它。
优势
- 始终使用当前数据,无需额外工作。
- 应用程序大小不会因数据而膨胀。
缺点
- JSON 检索的运行时影响。
- JSON 解析的运行时影响。
- 数据必须存储在模型中。
在编译时将 JSON 转换为 Elm 值
使用手写编译器(可能基于 json-schema-to-elm 生成的类型),我可以将 JSON 数据静态转换为 Elm 代码。因此,数据随应用程序一起提供,并且可以使用 Elm 原语进行访问。
优势
- 直接访问数据,无运行时影响。
- 数据未存储在模型中。
缺点
- 当数据改变时需要重新编译应用程序。
- 应用程序很大,因为需要包含所有数据。
权衡
根据以上列表,这是我的结论。
- 我希望数据很少更改(在开始的管理期之后)。重新编译和部署应用程序应该很简单;不会有任何需要小心的外部交互。
- 该应用程序应该在移动设置中使用,因此节省网络请求和处理器负载是一件好事。
- 我想要一个独立版本供离线使用,所以拥有一个整体甚至可能会有帮助。
- 实际数据集不会太大;我估计最多也就几百千字节,包括所有语言。
因此,我认为在我的情况下使用预编译的 Elm 值是更好的解决方案。
我的问题是:我是否遗漏了这两种方法中可能影响我权衡取舍的任何方面?我应该考虑其他方法吗?
请注意,我现在并不担心具体的工具;这更像是一个概念性的设计问题。
巩固以上评论中的对话:
您提到的两个包,json-schema-to-elm
和 json-to-elm
的输出大致相似。它们都呈现包含类型、解码器和编码器的 Elm 源代码。
主要区别在于它们的输入:
json-schema-to-elm
将 JSON Schema 作为输入。当您的 JSON 变得比示例描述的更复杂时,这很有用,但它还需要您为所有要建模的 JSON 编写一个模式文件。json-to-elm
将示例 JSON 值作为输入。这在您的 JSON 模型相对简单时很有用。
就我个人而言,我会尝试编写一些概念证明,看看是否真的存在任何有害的运行时低效问题。您始终可以将 json 值作为字符串保留在 .elm 文件中 - 这将简化离线访问,避免网络流量,而且真正唯一的缺点是每个 json 输入的每个值解码一次,因为如果它没有改变,你将不需要再次解码它。
注意:如果您采用将 json 作为字符串值嵌入 .elm 文件的方式,请注意 multi-line string syntax 这将有助于避免原始 [=38= 中的大量转义字符] 字符串
这是一个想法。
- 使用
json-schema-to-elm
生成类型和解码器。 - 在 Elm 应用程序中,加载 JSON 数据。
- 使用
toString
并将结果写入文件。 - 修复结果中的任何问题,使其成为真正的源文件。
根据documentation,结果toString
should look just like the value it came from.
此方法的功效取决于:
- 如何很好地集成工作流:
json-schema-to-elm
是一个 Elixir 应用程序,而 Elm 并不是真正可编写脚本的。 json-schema-to-elm
对您的架构的支持程度。
在我的例子中,json-schema-to-elm
不接受该架构(错误消息不多),而且它似乎根本不支持 patternProperties
(可能还有 [= 的其他功能) 43=] 模式)。