debuging&#34; undefined&#34;或&#34; <internal structure =“”>&#34;对于Json解码和类似

时间:2016-05-09 14:27:48

标签: json debugging elm

我有一个大的(&gt; 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

1 个答案:

答案 0 :(得分:2)

我建议为自定义解码器构建单元测试。不仅如此,我建议在构建任何解码器时使用单元测试启动。如果您开始使用适合您在现实世界中看到的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解析错误消息,但现在您可以更轻松地找到问题,因为您将确切地知道哪些测试失败了。