在 Elm 应用程序中使用静态数据:解析 JSON 还是使用 Elm 值?

Posted

技术标签:

【中文标题】在 Elm 应用程序中使用静态数据:解析 JSON 还是使用 Elm 值?【英文标题】:Using static data in Elm applications: parse JSON or use Elm values? 【发布时间】:2017-09-15 09:31:11 【问题描述】:

我即将开始开发一个主要用于显示数据集的 Elm 应用程序。数据将准备好几个 JSON 文件(包括不同的文本语言),由 JSON 模式指定。这个数据库不会消失,因为共享数据集的其他用例存在。

我现在看到两个从 Elm 访问这些数据的选项。

在运行时检索和解析 JSON

使用json-schema-to-elm 或类似的,我可以从我拥有的模式生成数据类型和解析器。然后,在运行时,我加载应用程序需要的 JSON 并解析它。

优势

始终使用当前数据,无需额外工作。 应用程序大小不会因数据而膨胀。

缺点

JSON 检索对运行时的影响。 JSON 解析的运行时影响。 数据必须存储在模型中。

在编译时将 JSON 转换为 Elm 值

使用手写编译器(可能基于 json-schema-to-elm 生成的类型),我可以将 JSON 数据静态转换为 Elm 代码。因此,应用程序附带的数据可以使用 Elm 原语进行访问。

优势

直接访问数据,无运行时影响。 数据未存储在模型中。

缺点

数据变化时需要重新编译应用。 应用很大,因为需要包含所有数据。

权衡

根据上面的列表,这是我的结论。

我希望数据很少更改(在开始的管理期之后)。重新编译和部署应用程序应该很简单;不会有任何需要注意的外部互动。 该应用应该在移动设置中使用,因此节省网络请求和处理器负载是一件好事。 我希望有一个独立版本供离线使用,因此拥有一个整体可能会有所帮助。 实际数据集不会太大;我估计最多几百 KB,甚至包括所有语言。

因此,我认为在我的情况下,使用预编译的 Elm 值是更好的解决方案。

我的问题是:我是否遗漏了这两种方法中会影响我权衡的任何方面?我应该考虑其他方法吗?

请注意,我现在并不担心具体的工具;这更像是一个概念性的设计问题。

【问题讨论】:

【参考方案1】:

巩固上述 cmets 中的对话:

您提到的两个包json-schema-to-elmjson-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 这将有助于避免原始 json 字符串中出现大量转义字符

【讨论】:

【参考方案2】:

这是一个想法。

    使用json-schema-to-elm 生成类型和解码器。 在 Elm 应用中,加载 JSON 数据。 使用toString 并将结果写入文件。 修复结果中的任何问题,使其成为实际的源文件。

根据documentation,toString的结果

应该看起来就像它来自的值。

这种方法的效果取决于:

如何很好地集成工作流:json-schema-to-elm 是一款 Elixir 应用程序,而 Elm 并不是真正可编写脚本的。 json-schema-to-elm 支持您的架构有多好。

在我的例子中,json-schema-to-elm 不接受架构(错误消息很少有用),而且它似乎根本不支持 patternProperties(可能还有 JSON 架构的其他功能)。

【讨论】:

以上是关于在 Elm 应用程序中使用静态数据:解析 JSON 还是使用 Elm 值?的主要内容,如果未能解决你的问题,请参考以下文章

markdown 为什么我必须在Elm中编写JSON解码器?

函数式编程中的战斗机--elm编写实例(薛定鄂的猫)

Elm:将具有单个元素的 JSON 数组解码为字符串

无法在 Django 1.8 中解析静态 JSON 文件

如何在 URL 中没有 # (哈希)的情况下在 Elm 中进行路由/导航?

使用动态数据进行 JSON 解析