2013-07-15 1 views
2

J'ai un serveur qui reçoit JSON qui ressemble à:Comment conserver des parties non-chaîne de JSON en tant que chaînes en utilisant aeson?

{ "foo": "bar", "bono": "bobo", 
    "result": { "some": ["complex", "JSON", "structure",... 
} 

où toutes les choses est pour le serveur sauf pour « résultat », qui doit être transmis au client (travailleur --JSON- -> Serveur --valeur de "résultat" -> Client). Par conséquent, en analysant cette chose avec AESON, je veux garder la valeur de "résultat" comme une chaîne (ou texte ou autre), juste pour que je puisse le transmettre au client sans se soucier de ce qui est à l'intérieur. Le problème est que "résultat" peut être n'importe quoi (tableau, objet, etc.). Donc, si je

data RPCResult = RPCResult { foo :: Text, result :: Text } 

la fonction decode de Aeson va revenir Nothing, car « résultat » est pas nécessairement une chaîne JSON ...

Comment puis-je dire de garder Aeson parties du JSON objet tel quel et juste me les donner pour que je puisse faire ce que je veux avec eux?

Répondre

3

Il me semble avoir un peu d'une solution en faisant le type de result être Data.Aeson.Value puis après avoir fait une decode sur le JSON entrant, j'extraire le result et exécuter encode dessus avant de le transmettre. Je ne suis pas sûr que ce soit la meilleure solution (parce que je ne la garde pas comme une chaîne comme la question l'énonce, mais la décodage puis l'encodage encore ...) mais cela fonctionne:

Questions connexes