期待一些自定义错误

时间:2016-07-19 14:33:00

标签: elm

我是榆树的新手并试图解码一些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
>

1 个答案:

答案 0 :(得分:3)

<强>更新

elm-decode-pipeline version 2.0.0包含针对此问题的解决方法,因此nulloptional作为Nothing处理。

版本1.1.2的原始答案

当前版本的elm-decode-pipeline v1.1.2不会像您期望的那样处理显式空值。

使用optional时,如果某个字段不在json中,则解码器成功,但如果该值指定为null(例如"summaryDate": null),则解码器将失败并显示消息已发布。

有几种解决方法:

  1. 您可以更改类型可选字段以包含Maybe(例如summaryDate : Maybe String,然后相应地更改解码器,并在此过程中删除硬编码日期,以支持Nothing:< / LI>
    |> Json.Decode.Pipeline.optional "summaryDate" (Json.Decode.maybe Json.Decode.string) Nothing
    
    1. 或者,您可以绕过Json.Decode.Pipeline代码,转而使用本机Elm功能定义解码器。
    2. 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")
      
      1. 或者,您可以向elm-decode-pipeline的维护者发送拉取请求,以添加对显式空值的预期处理。 修改:我创建了a pull request,添加了正确的空值处理。