需要创建一个解码器,用于在父级别创建数据记录,并将其附加到elm中的所有子记录

时间:2017-03-02 11:39:31

标签: json elm

我有一个像这样的json:

{
  "username": "john",
  "email": "john@gmail.com",
  "items": [
     { 
        "id": "id 1"
     },
     { 
        "id": "id 2" 
     }
  ]
}

我需要将其解码为List Item。项目是这样的记录。

type alias Item =
    { id : String
    , user : User
    }

type alias User =
    { username : String
    , email : String
    }

我想从顶级json中提取用户名和电子邮件。然后从中创建一个User记录,然后将该用户放入Item中的每个List Item记录中。

我知道可以使用Decode.andThen来完成,但无法使其正常工作。

对于解码我正在使用json-decode-pipeline

由于

1 个答案:

答案 0 :(得分:5)

您当然可以使用andThen执行此操作。以下是使用标准JSON解码的示例(不需要json-decode-pipeline)。

首先,让我们创建一个用户解码器。这很简单:

userDecoder : Decoder User
userDecoder =
    map2 User
        (field "username" string)
        (field "email" string)

现在,让我们创建一个Item解码器,但是让它创建一个接受我们可以放在user字段上的User值的函数。你会在一分钟内看到原因:

itemDecoder : User -> Decoder Item
itemDecoder user =
    map2 Item
        (field "id" string)
        (succeed user)

现在我们可以创建顶级的Items解码器。您首先解码用户,然后在构建列表时将其传递给itemDecoder:

itemsDecoder : Decoder (List Item)
itemsDecoder =
    userDecoder
        |> andThen (\user ->
            field "items" (list (itemDecoder user)))

这可以写得更简洁:

itemsDecoder : Decoder (List Item)
itemsDecoder =
    userDecoder
        |> andThen (field "items" << list << itemDecoder)

Here is a working example on ellie-app.com