首页 > 解决方案 > 榆树用数组解码json对象

问题描述

我是榆树的新手。我试图从获取响应中获取数据。

现在我正在尝试为此制作解码器。我有这样的json:

{
  data: [
        {
            "price" = 300.5
        },
        {
            "price" = 1005
        }
    ]
}

我所需要的只是获得最低价格并退货。(至少返回每个价格)。

现在我堆叠在 Decode.index 上。

priceDecoder : Decode.Decoder String
priceDecoder = 
    Decode.field "data" Decode.list

接下来我该怎么办?

标签: jsonelm

解决方案


这个问题本身有几个问题。首先,你没有发布你得到的错误。我得到的错误是这样的:

The 2nd argument to `field` is not what I expect:

25|     Decode.field "data" Decode.list
                            ^^^^^^^^^^^
This `list` value is a:

    Decode.Decoder a -> Decode.Decoder (List a)

But `field` needs the 2nd argument to be:

    Decode.Decoder a

其次,您发布的 JSON 无效,data应该用引号括起来,属性和值应该用:, not分隔=

第三,类型priceDecoder似乎错误,因为 JSON 不包含String数据,或者您没有指定您也想FloatString. 我会假设类型是错误的。

因此,您(或至少我)得到的错误说这list是一个函数Decoder a -> Decoder (List a),而它只需要一个Decoder a值。这是因为list期望将 aDecoder a传递给它,它将用于解码列表中的每个项目。

我们将使用的解码器是Decode.field "price" Decode.float,它将对象的“价格”字段解码为Float.

我还将更改priceDecoderfrom的类型Decoder StringDecoder (List Float),因为价格是 aFloat并且我们正在解码其中的 a List,而不仅仅是获取第一个或最后一个值或类似的东西。我认为这就是您想要的,因为您说“至少返回每个价格”。

priceDecoder我们得到的是:

priceDecoder : Decode.Decoder (List Float)
priceDecoder = 
    Decode.field "data" (Decode.list (Decode.field "price" Decode.float))

推荐阅读