importPour l'utiliser : import Data.Json
JSON — un arbre de données transparent (RFC 8259)
Synopsis
data Json
= JNull
| JBool Bool
| JInt Int
| JDouble Double
| JString String
| JArray (List Json)
| JObject (List (String, Json))
deriving (Eq, Show)
Une valeur JSON. Les nombres distinguent entier exact (JInt, l'Int d'oppi est exact) et réel (JDouble). Un objet est une LISTE de paires : l'ordre d'insertion est préservé, les clés dupliquées conservées (lookup = dernière).
JNull
JBool
JInt
JDouble
JString
JArray
JObject
data JsonError = JsonError String Nat
deriving (Eq, Show)
Une erreur de parse : un message et la position (index de caractère 0-basé).
encode : Json -> String
Sérialise une valeur JSON en texte compact. O(n) et pile CONSTANTE sur les deux backends, même sur des entrées immenses. Total SAUF sur un JDouble NaN/Infini (non représentable en JSON) : lève proprement (panic).
data EWork
= EJson Json
| EArr (List Json)
| EObj (List (String, Json))
| ERaw String
EJson
EArr
EObj
ERaw
data PS = PS (List Char) Nat
parse : String -> Result JsonError Json
Analyse un texte JSON complet (une valeur, entourée d'espaces optionnels, puis fin d'entrée). Pile d'appels CONSTANTE sur les deux backends, à imbrication ET largeur arbitraires. Les erreurs portent la position 0-basée du caractère fautif.
data Frame
= FArr (List Json)
| FObj (List (String, Json)) String
FArr
FObj
data PMode
= PValue
| PAfter Json
PValue
PAfter
lookup : String -> Json -> Maybe Json
Cherche une clé dans un objet JSON. Sur clés DUPLIQUÉES : la DERNIÈRE gagne (cohérent avec la plupart des parseurs ; cf. RFC 8259 §4 « comportement imprévisible » — on fixe : last-wins).
asString : Json -> Maybe String
asInt : Json -> Maybe Int
asDouble : Json -> Maybe Double
asBool : Json -> Maybe Bool
asArray : Json -> Maybe (List Json)
asObject : Json -> Maybe (List (String, Json))