Question

Je ne peux pas donner un sens à toute la documentation. Quelqu'un peut-il s'il vous plaît donner un exemple de la façon dont je peux analyser la sortie exiftool raccourci suivant à l'aide du module Text.JSON Haskell? Les données génère à l'aide de la commande exiftool -G -j <files.jpg>.

[{
  "SourceFile": "DSC00690.JPG",
  "ExifTool:ExifToolVersion": 7.82,
  "File:FileName": "DSC00690.JPG",
  "Composite:LightValue": 11.6
},
{
  "SourceFile": "DSC00693.JPG",
  "ExifTool:ExifToolVersion": 7.82,
  "File:FileName": "DSC00693.JPG",
  "EXIF:Compression": "JPEG (old-style)",
  "EXIF:ThumbnailLength": 4817,
  "Composite:LightValue": 13.0
},
{
  "SourceFile": "DSC00694.JPG",
  "ExifTool:ExifToolVersion": 7.82,
  "File:FileName": "DSC00694.JPG",
  "Composite:LightValue": 3.7
}]
Était-ce utile?

La solution

Eh bien, la meilleure façon est de récupérer un JSValue du paquet JSON , comme donc (en supposant que vos données sont en text.json):

Prelude Text.JSON> s <- readFile "test.json"
Prelude Text.JSON> decode s :: Result JSValue
Ok (JSArray [JSObject (JSONObject {fromJSObject = [("SourceFile",JSString (JSONString {fromJSString = "DSC00690.JPG"})),("ExifTool:ExifToolVersion",JSRational False (391 % 50)),("File:FileName",JSString (JSONString {fromJSString = "DSC00690.JPG"})),("Composite:LightValue",JSRational False (58 % 5))]}),JSObject (JSONObject {fromJSObject = [("SourceFile",JSString (JSONString {fromJSString = "DSC00693.JPG"})),("ExifTool:ExifToolVersion",JSRational False (391 % 50)),("File:FileName",JSString (JSONString {fromJSString = "DSC00693.JPG"})),("EXIF:Compression",JSString (JSONString {fromJSString = "JPEG (old-style)"})),("EXIF:ThumbnailLength",JSRational False (4817 % 1)),("Composite:LightValue",JSRational False (13 % 1))]}),JSObject (JSONObject {fromJSObject = [("SourceFile",JSString (JSONString {fromJSString = "DSC00694.JPG"})),("ExifTool:ExifToolVersion",JSRational False (391 % 50)),("File:FileName",JSString (JSONString {fromJSString = "DSC00694.JPG"})),("Composite:LightValue",JSRational False (37 % 10))]})])

vous donne juste un JSON générique Haskell type de données.

L'étape suivante consistera à définir un type de données Haskell personnalisé pour vos données et écrire une instance de JSON pour cela, qui convertit entre comme ci-dessus, et votre type de JSValue.

Autres conseils

Merci à tous. A partir de vos suggestions, j'ai pu mettre en place les éléments suivants qui se traduit par le retour JSON en paires nom-valeur.

data Exif = 
    Exif [(String, String)]
    deriving (Eq, Ord, Show)

instance JSON Exif where
    showJSON (Exif xs) = showJSONs xs
    readJSON (JSObject obj) = Ok $ Exif [(n, s v) | (n, JSString v) <- o]
        where 
            o = fromJSObject obj
            s = fromJSString

Malheureusement, il semble que la bibliothèque est incapable de traduire le dos droit JSON en une simple structure de données Haskell. En Python, il est en une ligne: json.loads(s).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top