2016-07-19 28 views
0

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

回答

3

更新

elm-decode-pipeline version 2.0.0包括此问题的修复,使nulloptionalNothing处理。

为1.1.2

版本原来的答复的elm-decode-pipeline v1.1.2当前版本不处理空值的明确,你可能期望。

当使用optional,如果字段不是在JSON,解码器成功,但如果该值被指定为无效(例如"summaryDate": null),解码器将会失败,您已发布该消息。

有几种方法解决此问题:

  1. 你可以换更改类型可选字段包括Maybe(如summaryDate : Maybe String,则相应地更改解码器,并在这个过程中,去除硬编码日期赞成Nothing
|> 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添加了正确的空值处理。
  • +0

    非常感谢你的工作。我看到你回答了很多榆树问题,谢谢你帮助我们所有人!我只用了一个多星期,并且我仍然习惯了这些功能的组成。 –