haskell - Finding a value in ByteString (which is actually JSON) -
a web service returns response bytestring
req <- parseurl "https://api.example.com" res <- withmanager $ httplbs $ configreq req case (hashmap.lookup "result" $ responsebody res) of .... -- error - responsebody returns bytestring configreq r = --......
to more specific, responsebody
returns data in bytestring
, although it's valid json. need find value in it. obviously, easier find if json , not bytestring
.
if that's case, how convert json?
update:
decode $ responsebody resp :: io (either string aeson.value)
error:
couldn't match expected type `io (either string value)' actual type `maybe a0'
you'll find several resources converting bytestring json. simplest use cases on hackage page itself, , rest can infer using type signatures of entities involved.
https://hackage.haskell.org/package/aeson-0.7.0.6/docs/data-aeson.html
but here's super quick intro json aeson: in languages, have things this:
somestring = '{ "name" : ["value1", 2] }' adict = json.loads(somestring)
this great, because json has 1 one mapping fundamental data-structure of language. containers in dynamic languages can contain values of type, , moving json data structure single step.
however, not case haskell. can't put things of arbitrary types container type (a list, or dictionary).
so aeson neat thing. defines intermediate haskell type you, maps directly json.
a fundamental unit in aeson
value
. value can contain many things. integer, string, array, or object.
https://hackage.haskell.org/package/aeson-0.7.0.6/docs/data-aeson.html#t:value
an aeson array vector
(like list better) of value
s , aeson object hashmap
of text
value
s
the next interesting step can define functions convert aeson value haskell type. completes loop. bytestring
value
custom type.
so implement parsejson
, tojson
functions convert aeson values type , vice-versa. bit converts bytestring valid aeson value implemented aeson. heavy lifting done.
just important note, aeson bytestring lazy bytestring, might need strict lazy helpers.
stringtolazy :: string -> bytestring stringtolazy x = data.bytestring.lazy.fromchunks [(data.bytestring.char8.pack x)] lazytostring :: bytestring -> string lazytostring x = data.bytestring.char8.unpack $ data.bytestring.char8.concat $ data.bytestring.lazy.tochunks
that should enough started aeson.
--
common decoding functions aeson:
decode :: bytestring -> maybe yourtype eitherdecode :: bytestring -> either string yourtype.
in case, you're looking eitherdecode.
Comments
Post a Comment