我是榆树的新手并试图解码一些Json。但是我不断得到这个错误,期待它没有得到。
以下是代码示例。我不确定它的期望是什么。
module JsonTest exposing (..)
import Json.Decode
import Json.Decode.Pipeline
--Model
type alias Model =
{ msg : String
, tlps : List Tlp
}
decodeTlps : Json.Decode.Decoder Model
decodeTlps =
Json.Decode.Pipeline.decode Model
|> Json.Decode.Pipeline.hardcoded "Got Data"
|> Json.Decode.Pipeline.required "tlps" (Json.Decode.list decodeTlp)
type alias Tlp =
{ title : String
, trendingTopic : Bool
, synonym : Bool
, summaryDate : String
, lastFeatureAdded : String
, modifiedDate : String
}
decodeTlp : Json.Decode.Decoder Tlp
decodeTlp =
Json.Decode.Pipeline.decode Tlp
|> Json.Decode.Pipeline.required "title" (Json.Decode.string)
|> Json.Decode.Pipeline.optional "trendingTopic" (Json.Decode.bool) False
|> Json.Decode.Pipeline.optional "synonym" (Json.Decode.bool) False
|> Json.Decode.Pipeline.optional "summaryDate" (Json.Decode.string) "1/1/2016"
|> Json.Decode.Pipeline.optional "lastFeatureAdded" (Json.Decode.string) "1/1/2016"
|> Json.Decode.Pipeline.optional "modifiedDate" (Json.Decode.string) "1/1/2016"
json =
"""
{
"tlps": [
{
"title": "Topic 1",
"trendingTopic": false,
"synonym": false,
"summaryDate": null,
"lastFeatureAdded": null,
"modifiedDate": null
},
{
"title": "Topic 2",
"trendingTopic": false,
"synonym": false,
"summaryDate": null,
"lastFeatureAdded": null,
"modifiedDate": null
},
{
"title": "Topic 3",
"trendingTopic": false,
"synonym": false,
"summaryDate": null,
"lastFeatureAdded": null,
"modifiedDate": null
},
{
"title": "Topic 4",
"trendingTopic": false,
"synonym": false,
"summaryDate": null,
"lastFeatureAdded": null,
"modifiedDate": null
}
]
}
"""
如果我在repl中运行以下内容我
> import JsonTest
> import Json.Decode
> Json.Decode.decodeString JsonTest.decodeTlps JsonTest.json
Err "Expecting something custom at _.tlps[3] but instead got: {\"title\":\"Topic 4\",\"trendingTopic\":false,\"synonym\":false,\"summaryDate\":null,\"lastFeatureAdded\":null,\"modifiedDate\":null}"
: Result.Result String TLPDashboard.Model
>
答案 0 :(得分:3)
<强>更新强>
elm-decode-pipeline version 2.0.0
包含针对此问题的解决方法,因此null
将optional
作为Nothing
处理。
版本1.1.2的原始答案
当前版本的elm-decode-pipeline v1.1.2
不会像您期望的那样处理显式空值。
使用optional
时,如果某个字段不在json中,则解码器成功,但如果该值指定为null(例如"summaryDate": null
),则解码器将失败并显示消息已发布。
有几种解决方法:
Maybe
(例如summaryDate : Maybe String
,然后相应地更改解码器,并在此过程中删除硬编码日期,以支持Nothing
:< / LI>
醇>
|> Json.Decode.Pipeline.optional "summaryDate" (Json.Decode.maybe Json.Decode.string) Nothing
Json.Decode.Pipeline
代码,转而使用本机Elm功能定义解码器。decodeTlp : Json.Decode.Decoder Tlp
decodeTlp =
let
optional decoder default = Json.Decode.oneOf [decoder, Json.Decode.succeed default]
in
Json.Decode.object6 Tlp
("title" := Json.Decode.string)
(optional ("trendingTopic" := Json.Decode.bool) False)
(optional ("synonym" := Json.Decode.bool) False)
(optional ("summaryDate" := Json.Decode.string) "1/1/2016")
(optional ("lastFeatureAdded" := Json.Decode.string) "1/1/2016")
(optional ("modifiedDate" := Json.Decode.string) "1/1/2016")
elm-decode-pipeline
的维护者发送拉取请求,以添加对显式空值的预期处理。 修改:我创建了a pull request,添加了正确的空值处理。