有没有办法解码任意json(例如:我们在编译时不知道键)?
例如,我需要解析以下json:
{
"Foo": [
"Value 1",
"Value 2"
],
"Bar": [
"Bar Value 1"
],
"Baz": []
}
其中键的名称和数量在编译时未知,并且可能会因GET请求而更改。目标基本上是将其解码为Map String (Array String)
类型
有没有一种方法可以使用purescript-argonaut?
答案 0 :(得分:1)
Map
的{{1}}实例将生成一个元组数组,您可以手动构造Map并查看编码的json。
EncodeJSON
输出应为let v = Map.fromFoldable [ Tuple "Foo" ["Value1", "Value2"] ]
traceM $ encodeJson v
。
相反,您需要将对象转换为元组数组,[ [ 'Foo', [ 'Value1', 'Value2' ] ] ]
可以为您提供帮助。
一个例子
Object.entries
// Main.js
var obj = {
foo: ["a", "b"],
bar: ["c", "d"]
};
exports.tuples = Object.entries(obj);
exports.jsonString = JSON.stringify(exports.tuples);
答案 1 :(得分:0)
您完全可以编写自己的代码,方法是首先通过Json
将字符串解析为jsonParser
,然后使用various combinators provided by Argonaut检查结果数据结构。
但是,我认为最快最简单的方法是先将其解析为Foreign.Object (Array String)
,然后再转换为您需要的内容,例如Map String (Array String)
:
import Data.Argonaut (decodeJson, jsonParser)
import Data.Either (Either)
import Data.Map as Map
import Foreign.Object as F
decodeAsMap :: String -> Either _ (Map.Map String (Array String))
decodeAsMap str = do
json <- jsonParser str
obj <- decodeJson json
pure $ Map.fromFoldable $ (F.toUnfoldable obj :: Array _)