2014-09-09 7 views
2

Я использую рекомендованный Aeson пакет, но мне нужно разобрать целые числа. Я хотел бы сделать что-то вроде:Как разобрать целое число с Aeson

decode "5" :: Maybe Int 

и захватить результат, но как документация объясняет (http://hackage.haskell.org/package/aeson-0.8.0.0/docs/Data-Aeson.html), эсон не поддерживает разбор простых типов (блестящая идея!):

>>> decode (encode (1 :: Int)) :: Maybe Int 
Nothing 

Вы ссылаетесь на использование парсера значений, а не на синтаксический анализатор json, но нет указаний на то, как на самом деле использовать этот парсер. Если вы посмотрите на источник для декодирования, вы увидите, что внутри Aeson имеет параметр decodeWith, который принимает парсер, но это скрыто от вас. Кажется, что импорт Data.Attoparsec и работающий parse value "5" могут работать, но мне также трудно получить значимые результаты.

ответ

3

Это не сработает, потому что JSON не поддерживает 1 как действительный документ JSON, единственными допустимыми значениями верхнего уровня, которые являются JSON, являются объекты и массивы. Вы можете легко это исправить, поставив квадратные скобки вокруг значения и его расшифровки в виде списка Int с:

> decode "[1]" :: Maybe [Int] 
Just [1] 

decode функция только преобразует JSON документов значений Haskell, а не просто значение JSON к значениям Haskell. Это можно увидеть в документах под json:

Разберите значение JSON верхнего уровня. Это должно быть либо объект или массив, в RFC 4627.

Однако, на самом деле использовать value анализатор с использованием Data.Attoparsec и Data.Aeson.Parser:

> parseOnly value "1" 
Right (Number 1.0) 

И с помощью простого шаблона совпадает вы можете извлечь это значение к значению Data.Scientific.Scientific, которое Aeson использует как числовой.

+0

@singular Извините, что см. Мои правки. В принципе, вы можете использовать 'Data.Attoparsec.parseOnly' с' значением' для разбора произвольного JSON, но вы не получите столько тонкостей, как предусмотрено в 'decode'. – bheklilr

+0

Ах, похоже, parseOnly сделает трюк. – RussellStewart

Смежные вопросы