You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elm中JSON解析问题:加载的Shape列表无法在表格显示

问题排查:Elm JSON解码器无法正确加载Shape列表

首先咱们一步步拆解你的问题——手动添加元素能正常展示,但JSON加载的内容不行,核心问题确实出在解码器的实现逻辑上,还有几个小细节需要修正。

1. 原解码器的核心隐患

你当前的解码器尝试一次性解码所有可能的字段(不管是circle还是rect的),再通过func分支构造Shape,这种方式存在两个关键问题:

  • 首先,decode func应该是Decode.map6 func(因为你的func接收6个参数),如果这里写错了,解码器会直接失效,导致加载失败后saved列表始终为空。
  • 其次,用optional给不存在的字段赋默认值虽然可行,但不够严谨,而且容易掩盖真正的解码错误(比如某个必填字段缺失时,你可能得不到明确的错误提示)。

2. 正确的解码器:根据Shape类型分支解码

Elm的JSON解码器支持根据字段值动态选择解码逻辑,咱们可以先解码shape字段,再根据它的值匹配对应Shape需要的字段,这样更精准也更容易排查问题:

import Json.Decode as Decode exposing (Decoder)

shapeDecoder : Decoder Shape
shapeDecoder =
    Decode.field "shape" Decode.string
        |> Decode.andThen
            (\shapeType ->
                case shapeType of
                    "circle" ->
                        -- Circle仅需解码x、y、r三个必填字段
                        Decode.map3 Circle
                            (Decode.field "x" Decode.string)
                            (Decode.field "y" Decode.string)
                            (Decode.field "r" Decode.string)

                    "rect" ->
                        -- Rectangle仅需解码x、y、width、height四个必填字段
                        Decode.map4 Rectangle
                            (Decode.field "x" Decode.string)
                            (Decode.field "y" Decode.string)
                            (Decode.field "width" Decode.string)
                            (Decode.field "height" Decode.string)

                    _ ->
                        -- 遇到未知类型时抛出明确错误,方便调试
                        Decode.fail ("Unrecognized shape type: " ++ shapeType)
            )

decoder : Decoder (List Shape)
decoder =
    Decode.at ["shapes"] (Decode.list shapeDecoder)

3. 修正JSON格式的小细节

你提供的JSON末尾有一个多余的逗号,这是无效JSON,会直接导致解码失败:

{ "shapes":[ { "shape": "circle", "x": "50", "y": "50", "r": "40" }, { "shape": "rect", "x": "100", "y": "100", "width": "50", "height": "60" }, ]}

需要去掉{ "shape": "rect"... }后面的逗号,修正为:

{ "shapes":[ { "shape": "circle", "x": "50", "y": "50", "r": "40" }, { "shape": "rect", "x": "100", "y": "100", "width": "50", "height": "60" } ]}

4. 额外调试建议

如果还是有问题,可以在JsonLoaded (Err err)分支添加调试逻辑,打印错误信息快速定位问题:

JsonLoaded (Err err) ->
    (model, Debug.log "JSON解码错误:" err |> Cmd.none)

这样修改后,解码器就能正确识别不同的Shape类型,加载后的saved列表应该就能正常显示在表格里了。

内容的提问来源于stack exchange,提问作者Maximilian Goldacker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:04:12