用于带有数据的 Union 类型的 Elm JSON 解码器

2024-01-13

我的 json 看起来像这样:

{"name": "providerWithVal", "value": "example"}

或者像这样:

{"name": "provider2"}

or

{"name": "provider3"}

我的 Elm 联合类型定义如下:

type Provider
    = ProviderWithVal String
    | Provider2
    | Provider3

我可以为联合类型编写一个解码器,无需附加数据。但ProviderWithVal需要一个字符串,我不知道如何让它全部工作。

这是我到目前为止所拥有的:

import Json.Decode as D

providerDecoder : D.Decoder Provider
providerDecoder =
    D.field "name" D.string |> D.andThen providerNameDecoder

providerNameDecoder : String -> D.Decoder Provider
providerNameDecoder string =
    case string of
        "providerWithVal" -> D.succeed ProviderWithVal
        "provider2" -> D.succeed Provider2
        "provider3" -> D.succeed Provider3
        _ -> D.fail <| "Invalid provider: " ++ string

解决您问题的快速方法是更换D.succeed ProviderWithVal with D.map ProviderWithVal (D.field "value" Decode.string)

但我会创建一个助手来匹配目标字符串,然后按以下方式使用它:

decoder =
    Decode.oneOf [ decodeWithVal, decodeP2, decodeP3 ]


decodeWithVal =
    exactMatch (Decode.field "name" Decode.string)
        "providerWithVal"
        (Decode.map ProviderWithVal <| Decode.field "value" Decode.string)


decodeP2 =
    exactMatch (Decode.field "name" Decode.string) "provider2" (Decode.succeed Provider2)


decodeP3 =
    exactMatch (Decode.field "name" Decode.string) "provider3" (Decode.succeed Provider3)


exactMatch : Decoder String -> String -> Decoder a -> Decoder a
exactMatch matchDecoder match dec =
    matchDecoder
        |> Decode.andThen
            (\str ->
                if str == match then
                    dec

                else
                    Decode.fail <| "[exactMatch] tgt: " ++ match ++ " /= " ++ str
            )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于带有数据的 Union 类型的 Elm JSON 解码器 的相关文章

随机推荐

  • 等待 su 中的命令完成

    我正在运行一个suAndroid 中的进程本身运行 screencap 实用程序 system bin screencap 每次用户摇晃手机时 我想等待每个屏幕截图完成 然后再允许用户通过摇动手机拍摄另一个屏幕截图 然而 使用process
  • 如何使用 ffmpeg 应用多个过滤器和输入

    我不仅有多个过滤器 而且有多个要覆盖的输入 我通常需要 2 3 个步骤来完成它们 并且想知道如何用一个命令完成所有这一切 因为这应该是最有效的方法 1和2字面意思相同 为了便于阅读 我删除了非常长且复杂的实际过滤器 图像向左滑到视频上 取1
  • 获取 char 输入并将其存储在数组中

    我想获取 n 个输入并将其保存在数组 c 和 p 中 然后使用它们 我目前已经写了这个 但我没有得到想要的输出 include
  • sympy 中的复数:解析欧拉恒等式

    我正在使用 sympy python 3 中的复杂函数 但无法让 sympy 简化方程 特别是我无法使用欧拉恒等式将复指数分解为实部和虚部 这是我的代码 import sympy as sym from sympy import I ini
  • 查询数据表字段包含列表中任何项目的行

    我是 LINQ 的新手 我想查询描述列字符串 示例值 我今天感觉很幸运 包含 匹配 a 中的任何项目的所有行List
  • S3 存储桶操作不适用于任何资源

    我正在按照以下指示进行操作这个答案 https stackoverflow com a 23102551 773263生成以下 S3 存储桶策略 Id Policy1495981680273 Version 2012 10 17 State
  • 如何使用 com.android.camera.action.CROP 设置输出图像

    我有裁剪图像的代码 如下所示 public void doCrop Intent intent new Intent com android camera action CROP intent setType image List
  • 如何为python3.4.2安装pysqlite

    i use kali linux and i need sqlite3 driver for python3 4 2 i tried the pysqlite install but get an erorr pls help me how
  • JS SDK 与 PHP SDK

    从我对各个网站的简要探索来看 JS SDK 似乎比 PHP SDK 更常用 即使是用 PHP 实现的网站也使用 JS SDK PHP 参考页面有 776 个赞 而 JS 参考页面有 20k 个赞 PHP 参考页面说 PHP SDK 可以帮助
  • 任何 redis 调用的 ioredis send 命令的默认超时是多少

    我将 ioredis 与节点应用程序一起使用 由于集群中的一些问题 我开始得到 集群重定向过多 最后一个错误 错误 连接已关闭 由于这个原因 我的所有 redis 调用都失败了 并且经过了很长一段时间 从 1 秒到 130 秒 ioredi
  • “精化”的反义词是什么

    在世界上通用编程的概念细化很常见 特别是给定一个概念C1 那么我们说一个概念C2提炼C1如果它提供了所有功能C1甚至可能更多 怎么称呼逆关系呢 因此 如果C2是一个细化C1 then C1是一个什么C2 语言学中有两个术语定义了本主题中讨论
  • 如何在 BigQuery UDF 主体内声明变量?

    我试图在 BigQuery 上创建一个带有 while 循环的 UDF 函数 但我在文档中没有看到任何专门解决这种情况的语法指南 也没有解决 UDF 正文中变量的声明 上下文 我正在尝试构建一个函数来将标题大小写应用于字符串 I tried
  • 将 dplyr tbl 列提取为向量

    是否有一种更简洁的方法可以从具有数据库后端的 tbl 中获取 dplyr tbl 的一列作为向量 即数据框 表不能直接成为子集 require dplyr db lt src sqlite tempfile create TRUE iris
  • 如何在Python中删除重复的短语?

    假设我有一个字符串 例如 I hate some kinds of duplicate This string has a duplicate phrase duplicate phrase 我想删除第二次出现的duplicate phra
  • 更改日历项目的前景色

    我正在 WPF 中自定义日历控件 并且可以调整背景颜色 标题前景色等 但我找不到如何编辑 1 31 天日历项目的外观 在 截屏 正如您所看到的 这些数字都是深灰色的 几乎不可读 我还想去掉鼠标悬停时的蓝色覆盖层 Code
  • 图层列表忽略标签

    我想创建一个自定义单选按钮 我使用与
  • 如何通过Windows命令行关闭TCP和UDP端口

    有人知道如何通过 Windows 命令行关闭单个连接的 TCP 或 UDP 套接字吗 谷歌了一下 我看到有人问同样的问题 但答案看起来像是 netstat 或 netsh 命令的手册页 重点关注如何监视端口 我不需要有关如何监控它们的答案
  • 如何将 Postgres 中两个数组的值插入表中?

    假设 我有一张桌子 create table mytable x text y text 我有一些数组 其值为x并为y called arr x and arr y x1 x2 x3 y1 y2 y3 我想通过一个查询插入这些值 期望的结果
  • 版本控制为了版本控制?

    我在公司的上一个版本中负责监督分支和合并 并且多次必须修改我们的 Subversion 预提交挂钩 以强制执行对签入注释等的不同要求 每次编辑这些文件时我都有点紧张 因为 a 它们是现场制作系统的一部分 尽管仅在内部使用 而且我们不是一个庞
  • 用于带有数据的 Union 类型的 Elm JSON 解码器

    我的 json 看起来像这样 name providerWithVal value example 或者像这样 name provider2 or name provider3 我的 Elm 联合类型定义如下 type Provider P