为 Json 解码和类似调试 "undefined" 或“<internal structure>”

debuging "undefined" or "<internal structure>" for Json decode and similiar

我有一个大型(>8 个元素)对象,其中包含一个可能为空的字符串列表 ids

我想在 elm 中读取数据并进行解析。最初我的尝试返回 <internal structure>undefined

我发现问题出在不处理空值上。我花了很长时间来诊断和测试每个元素是乏味的。我不知道在哪里寻找编译器或 运行 时间提示。如何在榆树中处理这个问题?

是否有既定的方法可以针对 javascript 对象快速验证 Elm 模型?有放置 Debug.* 语句的好地方吗?使用 repl 进行测试的方法?

对象

 # curl '0.0.0.0:3003/person_search_view?select=ids'|jq -c
 [{"ids":["11488"]},{"ids":["11489"]},{"ids":[null]}]

密码

-- testing what part is failing
-- *tedious* made a function to test reading in each type [List String, String, Int] 
justID : (List String) -> Person
justID ids =
  Person 0 "" "" "" "" "" ""   0 "" 0 0 0 ids [""] [""] ""

stringlist : Decode.Decoder (List String)
stringlist = list (oneOf [string, null "N/A"] )

memberDecoderID : Decode.Decoder Person
memberDecoderID =
  Decode.succeed
    justID
    |: ("ids"      := stringlist  ) -- here was failing (List string)

fetchAllUrl = "http://0.0.0.0:3003/person_search_view?order=curage"

fetchAll : Effects Action
fetchAll =
  Http.get (Decode.list memberDecoderID ) fetchAllUrl
 |> Task.toResult
 |> Task.map FetchAllDone 
 |> Effects.task

我建议为您的自定义解码器构建单元测试。不仅如此,我还建议在构建任何解码器时开始 进行单元测试。如果您开始围绕尽可能小的解码器构建单元测试,使用适合您在现实世界中看到的 JSON 值,您可能会更快地发现错误,并且可以保证您的代码不会过时因为您在此过程中遇到的每个错误都必须通过向后兼容的单元测试来修复。

例如,您可以使用名字有趣的 deadfoxygrandpa/elm-test 库并编写如下测试:

-- in your CustomDecoders.elm file...
stringlist : Decode.Decoder (List String)
stringlist = list (oneOf [string, null "N/A"] )

-- in your CustomDecoders-Tests.elm file...
tests : Test
tests = 
  suite "A Test Suite"
    [ test "stringlist decodes string lists"
      <| assertEqual (decodeString stringlist "[\"1\",\"2\",\"3\"]") (Ok ["1","2","3"])
    , test "stringlist decodes null"
      <| assertEqual (decodeString stringlist "[null]") (Ok ["N/A"])
    ]

您可能仍然需要处理神秘的 JSON 解析错误消息,但现在您将更容易找到问题,因为您将确切地知道哪些测试失败了。