2017-03-14 15 views
2

ソースコードelmplaygroundで試してみたいと思います。ブログ用の設定jsonファイルを作成しようとしています。私がこの時点で抱えている問題は、ポスト/ページの著者をどのようにネストされた構造としてデコードできるか分かりません。私が望むのは、投稿とページのauthorフィールドがconfig.jsonの著者への参照を行うということです。ネストされたJSON構造のデコード

config.json:ページと投稿のため

{ 
    "posts": [{ 
    "slug": "/hello-world", 
    "title": "Hello World", 
    "name": "hello-world", 
    "publishedDate": "2016-10-30", 
    "author": "Gabriel", 
    "intro": "" 
    }], 
    "pages": [{ 
    "slug": "/hello", 
    "name": "index", 
    "title": "Elm Playground", 
    "publishedDate": "2016-09-01", 
    "author": "Gabriel", 
    "intro": "" 
    }], 
    "authors": { 
    "Gabriel": { 
     "name": "Gabriel Perales", 
     "avatar": "..." 
    } 
    } 
} 

型コンテンツ:

type alias Content = 
    { title : String 
    , name : String 
    , slug : String 
    , publishedDate : Date 
    , author : Author 
    , markdown : WebData String 
    , contentType : ContentType 
    , intro : String 
    } 

種別著者:

type alias Author = 
    { name : String 
    , avatar : String 
    } 

現在、これが私のconfigデコーダである:

configDecoder : Decoder Config 
configDecoder = 
    Decode.map2 Config 
     (field "posts" <| Decode.list <| decodeContent Post) 
     (field "pages" <| Decode.list <| decodeContent Page) 

decodeContent : ContentType -> Decoder Content 
decodeContent contentType = 
    Decode.map8 Content 
     (field "slug" string) 
     (field "name" string) 
     (field "title" string) 
     (field "publishedDate" decodeDate) 
     (field "author" 
      (string 
       -- I want to decode the author from "authors" 
       -- I have tried with 
       -- (\name -> at ["authors", name] decodeCofigAuthor) but it doesn\'t work 
       |> andThen (\name -> Decode.succeed <| Author name "...") 
      ) 
     ) 
     (Decode.succeed RemoteData.NotAsked) 
     (Decode.succeed contentType) 
     (field "intro" string) 


decodeConfigAuthor : Decoder Author 
decodeConfigAuthor = 
    Decode.map2 Author 
     (field "name" string) 
     (field "avatar" string) 

答えて

3

著者を解読してからandThenを使用して、DictdecodeContentに渡します。 Decode.mapを使用して、authorsDictの検索名に著者名に変換することができます。

decoder = 
    (field "authors" <| Decode.dict <| authorDecoder) 
     |> Decode.andThen configDecoder 

configDecoder authors = 
    Decode.map2 Config 
     (field "posts" <| Decode.list <| decodeContent Post authors) 
     (field "pages" <| Decode.list <| decodeContent Page authors) 

decodeContent contentType authors = 
    Decode.map8 Content 
     -- … 
     (field "author" (string |> Decode.map (\name -> Dict.get name authors))) 
     -- … 

これはMaybe Authorを使用するようにモデルを変更するだろうが、あなたはまた、Decode.andThenを使用してDecode.failDict.getあれば戻りNothingを返すことができます。

+0

私はそれを試してみるつもりですが、私が探していたもののように見えます – gabrielperales

関連する問題