purescript-argonaut-generic gDecodeJson: свойство 'tag' отсутствует"

Я изучаю Argonaut и могу декодировать json вручную:

foo = """{"f":"xxx"}"""
newtype Foo =
  Foo {
    f :: String
  }
derive instance genericFoo :: Generic Foo
instance decodeJsonFoo :: DecodeJson Foo where
  decodeJson json = do
    obj <- decodeJson json
    f <- obj .? "f"
    pure $ Foo { f }
main = either log (\x -> log $ show $ decodeJson x :: Either String Foo) (jsonParser foo)

Вместо этого я пытаюсь использовать дженерики, и я подумал

instance decodeJsonFoo :: DecodeJson Foo where
  decodeJson = gDecodeJson

должно сработать.

однако я получил (Left "When decoding a Main.Foo: 'tag' property is missing")

просмотрел Generic. purs, но я новичок в дженериках и не могу понять.

Я что-то не понимаю или как это исправить?


person pt2121    schedule 11.06.2017    source источник


Ответы (1)


Попробуйте закодировать Foo { f: "xxx" } с помощью gEncodeJson - вы увидите, что выходной формат включает свойство tag, на что жалуется декодирование.

Общее кодирование/декодирование в основном полезно, когда оно используется в качестве формата сериализации в качестве вашего приложения. Для таких случаев, как этот, если у вас есть значение Foo, предоставленное откуда-то еще, лучше написать кодеки самостоятельно.

person gb.    schedule 11.06.2017