PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WEBDEV 2024 → Traiter du JSON
Traiter du JSON
Débuté par Nic, 06 oct. 2017 16:33 - 7 réponses
Posté le 06 octobre 2017 - 16:33
Bonjour,

je teste le système de paiement Stripe.

ce dernier renvoie du JSON pour le retour du paiement. Voici un exemple :

{
  "id": "evt_1B9wjqI5lFkNjxjMY3ECYXT6",
  "object": "event",
  "api_version": "2017-08-15",
  "created": 1507299822,
  "data": {
    "object": {
      "id": "ch_1B9wjqI5lFkNjxjMdZbUGyHO",
      "object": "charge",
      "amount": 5000,
      "amount_refunded": 0,
      "application": null,
      "application_fee": null,
      "balance_transaction": "txn_1B9wjqI5lFkNjxjMFPbWXifP",
      "captured": true,
      "created": 1507299822,
      "currency": "eur",
      "customer": null,
      "description": "test 5",
      "destination": null,
      "dispute": null,
      "failure_code": null,
      "failure_message": null,
      "fraud_details": {
      },
      "invoice": null,
      "livemode": false,
      "metadata": {
      },
      "on_behalf_of": null,
      "order": null,
      "outcome": {
        "network_status": "approved_by_network",
        "reason": null,
        "risk_level": "normal",
        "seller_message": "Payment complete.",
        "type": "authorized"
      },
      "paid": true,
      "receipt_email": null,
      "receipt_number": null,
      "refunded": false,
      "refunds": {
        "object": "list",
        "data": [
        ],
        "has_more": false,
        "total_count": 0,
        "url": "/v1/charges/ch_1B9wjqI5lFkNjxjMdZbUGyHO/refunds"
      },
      "review": null,
      "shipping": null,
      "source": {
        "id": "card_1B9wjpI5lFkNjxjMH4WEbcsa",
        "object": "card",
        "address_city": null,
        "address_country": null,
        "address_line1": null,
        "address_line1_check": null,
        "address_line2": null,
        "address_state": null,
        "address_zip": null,
        "address_zip_check": null,
        "brand": "Visa",
        "country": "US",
        "customer": null,
        "cvc_check": "pass",
        "dynamic_last4": null,
        "exp_month": 10,
        "exp_year": 2018,
        "fingerprint": "57ViDbvdFJ6e9D1Z",
        "funding": "credit",
        "last4": "4242",
        "metadata": {
        },
        "name": null,
        "tokenization_method": null
      },
      "source_transfer": null,
      "statement_descriptor": null,
      "status": "succeeded",
      "transfer_group": null
    }
  },
  "livemode": false,
  "pending_webhooks": 1,
  "request": {
    "id": "req_nilIw6QMSC2EFY",
    "idempotency_key": null
  },
  "type": "charge.succeeded"
}


J'arrive à récupérer cette réponse avec ce code :

gsJSON est une chaîne = PageParamètre(1)

Ensuite je voudrai pouvoir récupérer certaines informations de gsJSON afin de mettre à jour ma base, valider la commande, ...

Dans l'aide j'ai vu que l'on pouvait utiliser le type Variant, je fais donc ceci :

gvVariant est un Variant

gvVariant = JSONVersVariant(gsJSON)

Là j'ai une erreur : Format JSON invalide

Mon but, si cela est possible, est de récupérer les données pour les stocker dans une table de cette façon :

Stripe.ID = gvVariant.id
Stripe.data_id = gvVariant.data.object.id
Stripe.data_balance_transaction = gvVariant.data.object.balance_transaction
Stripe.data_receipt_email = gvVariant.data.object.receipt_email
Stripe.data_status = gvVariant.data.object.status
HAjoute(Stripe)
HRAZ(Stripe)

J'ai raté quelque chose ?

Merci
Membre enregistré
265 messages
Popularité : +14 (16 votes)
Posté le 06 octobre 2017 - 17:04
Bonjour Nic,

Première étape, récupérer la chaine JSON et vérifier sa validité, avec par exemple : https://jsonlint.com/

Seconde étape, si la syntaxe JSON est valide, il faut utiliser les outils de débogage de Webdev.
Par exemple, un point d'arrêt après l'affectation du gvVariant pour examiner son contenu.

Si ce contenu est un tableau de structures, il y a un indice à gérer.
Et là ce serait plutôt une syntaxe du type Stripe.ID = gvVariant[nIndice].id à considérer.

Bon Dev !!

--
René MALKA
Posté le 07 octobre 2017 - 09:48
Merci pour ta réponse, selon ton site le JSON est valide.

J'ai fais un test avec mon code, si le JSON est sur un niveau, simple, alors ca fonctionne :

{
"id": "evt_1B9wjqI5lFkNjxjMY3ECYXT6",
"object": "event",
"api_version": "2017-08-15",
"created": 1507299822,
"type": "charge.succeeded"
}


par contre dès que le JSON est plus complexe, avec des niveaux imbriqués alors j'ai l'erreur de JSON invalide comme ici la sous partie "data" :

{
"id": "evt_1B9wjqI5lFkNjxjMY3ECYXT6",
"object": "event",
"api_version": "2017-08-15",
"created": 1507299822,
"data": {
"object": {
"id": "ch_1B9wjqI5lFkNjxjMdZbUGyHO",
"object": "charge"
},
},
"type": "charge.succeeded"
}
Membre enregistré
265 messages
Popularité : +14 (16 votes)
Posté le 07 octobre 2017 - 11:19
Bonjour Nic,
C'est étonnant car, quel que soit le niveau d'imbrication, je n'ai jamais rencontré de problème avec JSONVersVariant.
Pas avec une chaîne JSON valide en tout cas.

Serais-tu d'accord pour me faire parvenir ta chaîne JSON entière, ici ou par mail ?

J'ai une bibliothèque de procédures qui traitent du JSON dans tous les sens.
Que j'avais écrite avant l'existence de JSONVersVariant dans le WL, et j'aimerai tester ta chaîne avec.

Cordialement

--
René MALKA
Posté le 07 octobre 2017 - 15:07
René,

la chaîne est celle de mon premier message.

Je précise que je suis en 19, je n'ai donc pas accès aux fonctions RESTRequete et RESTReponse.

Merci pour ton aide.
Membre enregistré
265 messages
Popularité : +14 (16 votes)
Posté le 08 octobre 2017 - 01:02
Nic,

Je n'ai eu aucun problème à convertir ta chaîne JSON.
Que ce soit avec JSONVersVariant ou avec ma bibliothèque de procédures :





Mais j'ai utilisé la version 20 de WB, car je n'ai plus la 19 où JSONVersVariant a été implémenté.
Il s'agit donc probablement d'un défaut de la version 19.

Si tu n'as pas d'autre choix que d'utiliser cette ancienne version alors essayes de placer un "[" en début de chaîne, et son complément "]" à la fin.
L'idée c'est qu'en lui faisant croire que c'est un tableau il va peut-être l'accepter...

Cordialement

--
René MALKA
Posté le 09 octobre 2017 - 08:57
"ÿÿÿÿÿÿ" a émis l'idée suivante :
Nic,

Je n'ai eu aucun problème à convertir ta chaîne JSON.
Que ce soit avec JSONVersVariant ou avec ma bibliothèque de procédures :





Mais j'ai utilisé la version 20 de WB, car je n'ai plus la 19 où
JSONVersVariant a été implémenté.
Il s'agit donc probablement d'un défaut de la version 19.

Si tu n'as pas d'autre choix que d'utiliser cette ancienne version alors
essayes de placer un "[" en début de chaîne, et son complément "]" à la fin.
L'idée c'est qu'en lui faisant croire que c'est un tableau il va peut-être
l'accepter...

Cordialement


oui JsonVersVariant ne fonctionne pas en 19.
Enfin je ne sais plus quelles limites il y avait avec ça ???
Des différences en windev, webdeb et WM ...

Il y avait un pb en W mobile car cela existait en android pas en ios ou
le contraire ...
bref le genre de trucs incompréhensibles (et inadmissibles) des
annonces qui ne fonctionnent pas partout.

---
Cet email a fait l'objet d'une analyse antivirus par AVG.
http://www.avg.com
Posté le 09 octobre 2017 - 09:21
René, Eric,

en fait en 19 ca marche dès l'instant que la chaine JSON est simple, dès qu'il y a des niveaux imbriqués là ca plante.
J'ai fais une requete au ST, peut-être qu'il existe un correctif mais je n'y crois pas trop.

Merci pour votre aide.