Affichage des articles dont le libellé est JSON. Afficher tous les articles
Affichage des articles dont le libellé est JSON. Afficher tous les articles

samedi 12 avril 2014

Sérialisation ABAP vers JSON

Choisir son sérialiseur ABAP vers JSON

Vous voilà lancés dans un nouveau projet dans lequel le format d'échange sera JSON (JavaScript Object Notation) ? Félicitations !

Nous en avions déjà parlé lors d'un précédent billet. Une des solutions est d'utiliser la brique SAP Gateway qui est capable de produire du JSON mais cette brique supplémentaire est soumise à des coûts de licence, éventuellement des coûts d'infrastructure si vous souhaitez la positionner sur un serveur dédié, etc...

Néanmoins, avoir un tel middleware dans votre paysage constitue un apport essentiel pour peu que vous commenciez à développer des interfaces pour mobiles par exemple !

Restons dans un cadre plus restreint où vous cherchez surtout à fournir un premier flux JSON.
Comment passer de vos données ABAP à ce format JSON ?

Offre de sérialisation ABAP vers JSON

Faisons un petit tour d'horizon de ce qui existe chez SAP et ce qui est proposé par la communauté des développeurs ABAP

SAP
  1. classe  CL_TREX_JSON_SERIALIZER
  2. classe /SDF/CL_E2E_XI_ALERT_JSON_DOC (Note OSS 1743560)
  3. classe /UI2/CL_JSON (nécessite l'UI2 Add-on)  [non testé]
  4. conversion native par le noyau via CALL TRANSFORMATION (7.02 and 7.03/7.31 (Kernelpatch 116))
Opensource
  1. ZJSON  (Assembla ou GitHub qui a l'air plus récent)  [version testée 0.2.0]
  2. json4abap
  3. smartJSON  (oublions celui-là en fait... il s'appuie sur le moteur Javascript du serveur ABAP)
  4. json_util
Noter que les solutions ZJSON et classe /SDF/CL_E2E_XI_ALERT_JSON_DOC sont très proches car l'un a servi à construire l'autre.  ;)

Validité du JSON produit

Tout d'abord, je vous recommande de valider le JSON produit à l'aide d'outils en ligne tel que http://jsonformatter.curiousconcept.com/ (qui liste en plus les erreurs rencontrées) avant d'arrêter votre décision !

On pourrait croire que tous ces sérialiseurs produisent un JSON valide et bien c'est loin d'être le cas.
Les solutions SAP 1) et 2) sont utilisées en interne par SAP et n'ont pas franchement vocation à être utilisés par nous autres développeurs. (autrement dit, pas sûr que le support SAP réponde favorablement à vos récriminations)
Il y a également quelques particularités en ABAP telles que l'absence d'un type primitif booléen ou le format des dates à prendre en compte.

Protocole de test
Toutes les solutions semblent relativement à l'aide avec la récursivité (structure/structure, table/table) donc on s'attardera sur le traitement des différents types ABAP.

Voici la structure de test que nous allons sérialiser :


Résultat du test

SAP
1) la classe CL_TREX_JSON_SERIALIZER ne met pas de quotes autour du nom des attributs et ajoute des espaces autour de valeurs numériques (cf. http://scn.sap.com/community/mobile/blog/2012/09/24/serialize-abap-data-into-json-format)
2) la classe /SDF/CL_E2E_XI_ALERT_JSON_DOC peut laisser des attributs sans valeur (les floats, chaines hexadécimales, ... ne semblent pas traités)

3) non testé
4) sans surprise, cette solution produit un JSON valide dans tous les cas


Opensource
1) idem SAP 2)
2) json4abap ne produit vraiment pas du bon JSON...!
il oublie d'entourer les attributs de quotes (noter qu'il laisse les attributs en majuscules comme il est d'usage en ABAP - et comme le fait la solution SAP 3) - mais ne pas oublier que JavaScript est sensible à la casse et que l'usage veut que les attributs y soient en minuscules, les majuscules étant plutôt réservées aux constantes), qu'il ne traite pas tous les types (on était prévenu sur la page d'accueil du projet !) et qu'il a implicitement converti le type NUMC en entier (en raison de l'absence de quotes)
3) trop smart à installer... oublions-le !
4) json_util ne se débrouille pas si mal. Certes, il a converti en entier le NUMC mais au moins il produit un JSON valide



Conclusion

Malgré une offre prolifique, compte-tenu des résultats de validité, le choix est assez restreint. Mon top 3 serait le suivant :
  1. conversion native par le noyau via CALL TRANSFORMATION
  2. ZJSON / classe /SDF/CL_E2E_XI_ALERT_JSON_DOC (en faisant attention au format float, etc...)
  3. json_util

vendredi 16 août 2013

JSON et ABAP

SAP a fait évoluer le noyau ABAP pour prendre en compte des fonctionnalités JSON.
Ce qui suit est disponible à partir de la version 7.02 (il s’agit d’un backport de la 7.40 vers la 7.31 et la 7.02)
Voir le blog d’un des gourous, Horst Keller, sur le sujet (ainsi que les commentaires qui sont tout aussi instructifs sinon plus !) :
http://scn.sap.com/community/abap/blog/2013/01/07/abap-and-json
J’ai relevé 2 apports intéressants :
  • une conversion ABAP <-> JSON prise en charge par le Kernel (on peut en espérer une performance bien meilleure, à vérifier…)
  • une visualisation dédiée des variables JSON dans le débugger

Un petit aperçu du dernier point
Source : SDN
Il existe des bibliothèques JSON si vous n'êtes pas encore dans cette version.
Attention au sérialiseur estampillé TREX (classe CL_TREX_JSON_SERIALIZER) qui ne produit pas un JSON valide.

Je vous recommande :
http://wiki.sdn.sap.com/wiki/display/Snippets/JSON+and+ABAP
https://code.google.com/p/zjson/

samedi 25 septembre 2010

Détendez-vous avec CashMachine !

Mise à jour (08-Janvier-2012) : CashMachine est passé sous OpenFeint et AGON Online a fermé le 30 Juin 2011 donc le badge ne fonctionnera plus... mais les enseignements tirés restent valables !!

Une fois n'est pas coutume, laissons SAP de côté et regardons une application - CashMachine - qui se décline en Flash et sur iPhone (avec une conversion du Flash en application iPhone via le Packager for iPhone d'Adobe ??)
Il ne s'agit d'une application toute récente mais on me l'a fait découvrir la semaine dernière.  ;-)

CashMachine

Les scores sont disponibles sur AGON Online.


Le petit badge que vous voyez ci-dessous est loin d'être anodin car il a fallu :

  1. attaquer l'API REST de la plateforme AGON (chaque application dispose de son propre ID application_id avec des catégories de score leaderboard_id différents par jeu)
  2. effectuer un appel JSON depuis l'application Flex
  3. encapsuler l'appel JSON dans un appel YQL pour pouvoir contourner les restrictions liées au crossdomain.xml
  4. contourner 2 bugs (sur encodeURI avec HTTPService et sur YQL qui renvoie une chaîne JSON bien étrange lorsque le JSON initial est complexe)
Un outil bien utile pour analyser le flux JSON : http://json.parser.online.fr/

Mais au final, vous avez un badge qui se met à jour automatiquement au chargement de ce billet !  :)
Vous pouvez faire de même sur votre site puisqu'il suffit de changer le paramètre FlashVars.
Pour ceux qui voudrait récupérer le projet Flex 3...

Le principe est à mi-chemin entre un Tetris et un Bejeweled (pour l'aspect graphique surtout) et consiste à aligner au moins 3 objets de nature identique pour les voir se transmuter en un objet de niveau immédiatement supérieur. Le jeu se complique donc au fur et à mesure car la variété des objets augmente progressivement.


Pour les possesseurs d'iPod Touch, d'iPhone et d'iPad, il existe une version gratuite (avec un bandeau publicitaire) et une version payante.

A noter l'intégration avec la plateforme Agon pour partager vos scores avec vos amis.



Voilà, bonne détente !

Ah une dernière chose, si comme moi vous trouvez étrange que le score diminue par moment, c'est normal ! Le jeu ne comptabilise pas la façon dont vous progressez (vous faîtes des combos par dizaine) mais seulement la valeur des objets à chaque instant. Ainsi chacun peut jouer de la manière qu'il préfère. Et puis, si vous faîtes des combos, dîtes-vous que vous avez plus de place pour mettre des objets de plus grande valeur pour la suite...   8oD

Mise à jour (26-Mars-2011) : suite à une modification du flux JSON par AGON, j'ai dû recompiler le Flex

PS : je ne suis nullement affilié avec les créateurs de ce jeu. Il ne s'agit pas d'un billet rémunéré !!  ;-)