请考虑以下递归类型定义:

type NestedList a
    = Elem a
    | SubList (List (NestedList a))

如何编写解码器以将JSON列表(例如[1, [[2, [3, 4]], 5], 6, [7, 8, 9]])解码为NestedList类型:

SubList
    [ Elem 1
    , SubList [ SubList [ Elem 2, SubList [ Elem 3, Elem 4 ] ], Elem 5 ]
    , Elem 6
    , SubList [ Elem 7, Elem 8, Elem 9 ]
    ]

推荐答案

它可以使用Json.Decode.oneOfJson.Decode.lazy递归完成. 嵌套的整数列表的解码器如下所示:

import Json.Decode as Decode exposing (Decoder)

nestedListDecoder : Decoder (NestedList Int)
nestedListDecoder =
    Decode.oneOf
        [ Decode.int |> Decode.map Elem
        , Decode.list (Decode.lazy (\_ -> nestedListDecoder)) |> Decode.map SubList
        ]

Json相关问答推荐

最新版本的Deneb在数据溢出时不支持滚动

使用单元和非单元版本反序列化Rust中的枚举,而无需编写自定义反序列化程序

Vega-Lite(Deneb):难以将最小和最大值应用于折线图和文本标签以及线条末尾的点

使用json_query更新事实

将PostgreSQL转换为JSON对象

将 REST API - json 输出转换为表 Power BI

如何对未知/变量键的字典进行编码?

将不带正文的 CURL POST 转换为 RESTRequest Delphi 代码 / 为 Dropbox API /get_current_account 端点编写 Delphi 代码

Jolt规范:将嵌套数组中的null元素移除

APIM 生成 JsonArray 到 EventHub

缺少所需的请求正文内容:org.springframework.web.method.HandlerMethod$HandlerMethodParameter

如何在 django rest 框架中定义列表字段?

在 Postgres 中向 JSON 对象添加元素

如何使用 SwiftyJSON 将字符串转换为 JSON

Peewee 模型转 JSON

字符串格式 JSON 字符串给出 KeyError

将 json 转换为 C# 数组?

PHP json_encode json_decode UTF-8

强制 JSON.NET 在序列化 DateTime 时包含毫秒(即使 ms 组件为零)

仅使用字符串和值解析 JSON 对象