簡體   English   中英

purescript-argonaut:解碼任意鍵值json

[英]purescript-argonaut: Decode arbitrary key-value json

有沒有一種方法可以解碼任意的json(例如:我們在編譯時不知道鍵)?

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

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

其中鍵的名稱和數量在編譯時未知,並且可能會因GET請求而更改。 目標基本上是將其解碼為Map String (Array String)類型

有沒有一種方法可以使用purescript-argonaut?

EncodeJSONMap實例將生成一個元組數組,您可以手動構造Map並查看編碼的json。

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);
-- Main.purs
module Main where

import Prelude

import Data.Argonaut.Core (Json)
import Data.Argonaut.Decode (decodeJson)
import Data.Argonaut.Parser (jsonParser)
import Data.Either (Either)
import Data.Map (Map)
import Debug.Trace (traceM)
import Effect (Effect)
import Effect.Console (log)

foreign import tuples :: Json
foreign import jsonString :: String

main :: Effect Unit
main = do
  let
    a = (decodeJson tuples) :: Either String (Map String (Array String))
    b = (decodeJson =<< jsonParser jsonString) :: Either String (Map String (Array String))
  traceM a
  traceM b
  traceM $ a == b

您可以完全自己編寫自己的代碼,方法是先通過jsonParser將字符串解析為Json ,然后使用Argonaut提供各種組合器檢查結果數據結構。

但是,我認為最快,最簡單的方法是Foreign.Object (Array String)其解析為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 _)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM