Допустим, у нас есть такой объект JSON (со строкой байтов, закодированной в base64):
TaggedImage = TaggedImage { id :: Text, image :: ByteString }
Теперь мы хотим получить image
из источника и сохранить его в месте, используя информацию в теге id
. Итак, это означает, что id
должен анализироваться заранее (чтобы определить местоположение изображения), а image
анализируется в потоковом режиме. Это просто сделать?
Я планирую использовать pipes-aeson
, aws
(для хранения S3
) и pipes
для выполнения потокового декодирования от производителя Websocket
с ведром S3
в качестве потребителя (которое нельзя создать, пока мы не проанализируем id
, чтобы определить местоположение ведра S3
). Глядя на decoded
a>, я не могу понять, могу ли я действительно сделать то, о чем просил выше. Это моя первая попытка потоковой передачи в JSON и каналах. Таким образом, помощь будет очень признательна.
Простой пример с чтением и записью в файловую систему также подойдет для замены Websocket producer
и S3 consumer
.
Дополнение
Поскольку пары ключ-значение JSON неупорядочены в соответствии с RFC, а массивы упорядочены, image
данные могут предшествовать id
, кажется, для типа данных, который я определил выше. Таким образом, это также может помочь изменить его на массив JSON (кортеж в Haskell, который, похоже, aeson
TH преобразует в упорядоченный массив). Пожалуйста, не стесняйтесь изменять определение типа данных, если это необходимо, чтобы наложить порядок декодирования. Например, тип данных может быть изменен на:
TaggedImage = TaggedImage (Text,ByteString)
decoded
может транслировать напрямую на диск. Каждое проанализированное значение JSON верхнего уровня анализируется полностью, прежде чем оно будет передано вам. - person ErikR   schedule 28.05.2016decoded
показывает то же самое. Будет ли ручной парсер работать вместоdecoded
? Например, создать поток из строки байтов и передать его непосредственно вpipes
после ручного разбораid
в упорядоченном массиве JSON? Не уверен, чтоaeson
позволяет это. - person Sal   schedule 28.05.2016Id ...
иchunk ...
. Когда вы видите строкуid ...
, начинается новый файл. Когда вы видите строкуchunk ...
, это означает, что этот закодированный фрагмент (base64) нужно записать в текущий файл. Возможно, пустая строкаchunk
означает конец файла. - person ErikR   schedule 28.05.2016