2010-01-18 5 views
4

Je ne trouve aucun sens à la documentation. Quelqu'un peut-il donner un exemple de comment je peux analyser la sortie exiftool raccourcie suivante en utilisant le module Haskell Text.JSON? Les données sont générées à l'aide de la commande exiftool -G -j <files.jpg>.Exemple d'analyse de la sortie JSON exiftool dans Haskell

[{ 
    "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 
}] 

Répondre

10

Eh bien, la meilleure façon est de récupérer un JSValue du paquet json, comme si (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))]})]) 

ce vous donne juste un JSON générique Type de données Haskell. 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 convertira entre JSValue comme ci-dessus, et votre type.

+0

J'ai d'abord posté une réponse séparée à peu près au même moment, mais je trouve que j'aime mieux le libellé de celui-ci ... Eh bien. Je vais juste ajouter mes 0,02 € comme commentaire: jetez un oeil au fichier 'Text/JSON.hs' dans les sources de json-the-package. Il y a tout un tas d'exemples simples de 'JSON' définis ici et ils peuvent servir d'exemples utiles. –

+1

Bonne réponse! Là encore, je n'attendrais rien de moins d'un co-auteur de 'Real World Haskell' (http://book.realworldhaskell.org/). Ce qui est un livre vraiment cool. –

+1

Pour les débutants totaux, vous devez d'abord 'Prélude>: m + Text.JSON' ... avant d'exécuter les lignes dans la réponse des dons. – ramanujan

2

Merci à tous. À partir de vos suggestions, j'ai pu rassembler les éléments suivants qui traduisent le JSON en paires nom-valeur. Malheureusement, il semble que la bibliothèque ne puisse pas traduire le JSON directement dans une structure de données simple Haskell. En Python, c'est un one-liner: json.loads(s).

+0

Eh bien, il doit être typé statiquement. Donc, le Haskell construit un type JSValue "simple" - avec lequel vous pouvez travailler directement si vous le souhaitez. L'avantage d'utiliser Haskell est la vérification statique supplémentaire que vous obtiendrez si vous construisez à son tour une structure spécifique. –