purescript-argonaut:解码任意键值json

时间:2019-06-10 21:08:14

标签: json purescript argonaut

有没有办法解码任意json(例如:我们在编译时不知道键)?

例如,我需要解析以下json:

{ 
    "Foo": [
        "Value 1",
        "Value 2"
    ],
    "Bar": [
        "Bar Value 1"
    ],
    "Baz": []
}

其中键的名称和数量在编译时未知,并且可能会因GET请求而更改。目标基本上是将其解码为Map String (Array String)类型

有没有一种方法可以使用purescript-argonaut?

2 个答案:

答案 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 _)