0
votes

Récupération d'une valeur de JSON Works, mais une approche identique sur l'autre valeur échoue

Le fichier source .json est aussi simple que ceci: xxx pré>

i peut renvoyer le "horodatage" code> valeur, mais en utilisant l'approche identique que je ne peux pas retourner le "tarif" code> valeur. p>

Ceci fonctionne sans problèmes: p> xxx pré>

mais quand j'essaie de remplacer TimeStamp code> avec Noter code>, je reçois le message d'erreur en surbrillance sur la ligne code> msgbox code>. P>

Erreur d'exécution '438':

L'objet ne prend pas en charge cette propriété ou cette méthode P> blockQuote>

Je pense que le problème réside dans VBA capitalisant automatiquement le taux code>. p> xxx pré>

se transforme automatique en p>

MsgBox oJSON.rates.EURUSD.Rate


3 commentaires

Découvrez [ Stackoverflow.com/Questtions/37710995/...


@Gareth - énormes merci! J'ai exploré toutes les options mentionnées et référencées dans cette question et a été capable de trouver la meilleure solution de compilation, c'est-à-dire CallbyName fonction.


Après l'après, le Solution de Slai semble mieux à mes yeux.


4 Réponses :


1
votes

J'utilise Cet outil pour analyser la réponse JSON comme ceci:

With CreateObject("MSXML2.XMLHTTP")
    .Open "GET", "https://www.freeforexapi.com/api/live?pairs=EURUSD", False
    .send
    Set oJSON = ParseJson(.responseText)
    .abort
End With


1 commentaires

Merci pour votre participation. Je pense que sur un plus grand projet, ce serait la voie à suivre. Cependant, si possible, j'ai tendance à éviter des outils et des références externes.



1
votes

Le contrôle de script fonctionnera pendant 32 bits plutôt que 64 bits.

Les suivants ont l'avantage de fonctionner sur les machines 32 et 64 bits


Utilisation de JSON Parser: < / forte>

J'utiliserais également jsonconverter.bas (ajouter ensuite une référence à l'exécution de scripts Microsoft) et, car elle renvoie un dictionnaire à l'intérieur, vous pouvez tester la touche xxx


à l'aide de regex: xxx


: xxx


2 commentaires

Merci pour votre participation. Je pense que sur un plus grand projet, ce serait la voie à suivre. Cependant, si possible, j'ai tendance à éviter des outils et des références externes.


Ajouté une réponse de regex.



0
votes

Une excellente solution pour les projets plus petits utilise callbyname code> fonction. Pas une jolie, mais peut faire le travail en une seule ligne et qu'il ne nécessite pas d'importer des fichiers externes vers le projet ou d'ajouter des références.

Sub current_eur_usd()

  Dim scriptControl As Object
  Set scriptControl = CreateObject("MSScriptControl.ScriptControl")
  scriptControl.Language = "JScript"
  Dim oJSON As Object

  With CreateObject("MSXML2.XMLHTTP")
    .Open "GET", "https://www.freeforexapi.com/api/live?pairs=EURUSD", False
    .send
    Set oJSON = scriptControl.Eval("(" + .responsetext + ")")
    .abort
  End With
  MsgBox VBA.CallByName(VBA.CallByName(VBA.CallByName(oJSON, "rates", VbGet), "EURUSD", VbGet), "rate", VbGet)

  Set oJSON = Nothing
  Set scriptControl = Nothing
End Sub


0 commentaires

1
votes

Une solution de contournement pourrait être en évaluant:

Set EURUSD = scriptControl.Eval("EURUSD = (" + .responsetext + ").rates.EURUSD")
Debug.Print scriptControl.Eval("EURUSD.rate")
Debug.Print EURUSD.timestamp


1 commentaires

Pour que cela fonctionne, je devais le mettre à l'intérieur du bloc avec le bloc , mais je ressemble à la lisibilité de cette solution. Comme QHarr expliqué, scriptControl ne fonctionnera que sur un bureau 32 bits, mais ce n'est pas un problème. pour moi. Merci!