Elm декодирует объект json с помощью массива - PullRequest
0 голосов
/ 06 ноября 2018

Я совершенно новый в ELM. Я пытаюсь получить данные от ответа.

Теперь я пытаюсь сделать декодер для этого. У меня есть JSON, как это:

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

Все, что мне нужно, это получить самую низкую цену и вернуть ее. (По крайней мере, вернуть каждую цену).

Теперь я остановился на Decode.index.

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

Что мне делать дальше?

1 Ответ

0 голосов
/ 06 ноября 2018

Есть несколько проблем с самим вопросом. Во-первых, вы не публикуете полученную ошибку. Я получаю следующую ошибку:

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 должен быть заключен в кавычки, а свойства и значения должны быть разделены :, а не =.

В-третьих, тип priceDecoder кажется неправильным, поскольку JSON не содержит данных String, или вы не указываете, что также хотите преобразовать Float в String. Я предполагаю, что тип просто неправильный.

Итак, ошибка, которую вы (или, по крайней мере, я) получаете, говорит о том, что list является функцией Decoder a -> Decoder (List a), в то время как она ожидает только значение Decoder a. Это потому, что list ожидает, что ему будет передан Decoder a, который он будет использовать для декодирования каждого элемента в списке.

Декодер, который мы будем использовать, это Decode.field "price" Decode.float, который будет декодировать поле "цена" объекта как Float.

Я также изменю тип priceDecoder с Decoder String на Decoder (List Float), поскольку цена составляет Float, и мы декодируем их List, а не просто получаем первый или последний значение или что-то подобное. Я полагаю, это то, что вы хотите, так как вы говорите «по крайней мере, вернуть каждую цену».

priceDecoder, которое мы получаем тогда:

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