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

abh*_*nav 4 json elm

我有一个这样的json:

{
  "username": "john",
  "email": "john@gmail.com",
  "items": [
     { 
        "id": "id 1"
     },
     { 
        "id": "id 2" 
     }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我需要解码它List Item.物品是这样的记录.

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

type alias User =
    { username : String
    , email : String
    }
Run Code Online (Sandbox Code Playgroud)

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

我知道它可以通过使用来完成Decode.andThen,但不能使它工作.

对于解码我使用的是json-decode-pipeline.

谢谢

Cha*_*ert 5

你当然可以这样做andThen.以下是使用标准JSON解码的示例(不需要json-decode-pipeline).

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

userDecoder : Decoder User
userDecoder =
    map2 User
        (field "username" string)
        (field "email" string)
Run Code Online (Sandbox Code Playgroud)

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

itemDecoder : User -> Decoder Item
itemDecoder user =
    map2 Item
        (field "id" string)
        (succeed user)
Run Code Online (Sandbox Code Playgroud)

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

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

这可以写得更简洁一点:

itemsDecoder : Decoder (List Item)
itemsDecoder =
    userDecoder
        |> andThen (field "items" << list << itemDecoder)
Run Code Online (Sandbox Code Playgroud)

这是ellie-app.com上的一个工作示例.