2 votes

Composer un objet VBScript

J'utilise donc un code vbscript à travers mes Com Objects afin de décoder un fichier json. au début mon code VBs était :

Function filejson(json) 
  On Error Resume Next
  Dim objStream, strData 
  Set objStream = CreateObject("ADODB.Stream") 
  objStream.CharSet = "utf-8" 
  objStream.Open 
  objStream.LoadFromFile(json) 
  strData = objStream.ReadText()
  filejson=strData
End Function 

Function str2json(json,value) 
  On Error Resume Next
  Set scriptControl = CreateObject("MSScriptControl.ScriptControl") 
  scriptControl.Language = "JScript" 
  Set searchResultObject = scriptControl.Eval("(" + json + ")")
  str2json=Eval("searchResultObject" & value )
End Function

Function result(json,value)
   On Error Resume Next
   result=str2json(filejson(json),value)
End Function

Donc je prenais juste toutes les valeurs que je voulais juste avec

result("movie.json",".adult") for example:

Avec Json :

{"adult":false,"backdrop_path":"/hbn46fQaRmlpBuUrEiFqv0GDL6Y.jpg"}

Et je prenais très bien les "faux".

Mais alors, mes fils sont devenus plus difficiles...

{"adult":false,"backdrop_path":"/hbn46fQaRmlpBuUrEiFqv0GDL6Y.jpg","belongs_to_collection":{"id":86311,"name":"The Avengers Collection","poster_path":"/qJawKUQcIBha507UahUlX0keOT7.jpg","backdrop_path":"/zuW6fOiusv4X9nnW3paHGfXcSll.jpg"}}

Mais j'ai quand même réussi à obtenir des données à partir de là avec mon deuxième argument : ".belongs_to_collection.id" Jusqu'à ce que je trouve ceci :

{
    "adult": false,
    "backdrop_path": "/hbn46fQaRmlpBuUrEiFqv0GDL6Y.jpg",
    "belongs_to_collection": {
        "id": 86311,
        "name": "The Avengers Collection",
        "poster_path": "/qJawKUQcIBha507UahUlX0keOT7.jpg",
        "backdrop_path": "/zuW6fOiusv4X9nnW3paHGfXcSll.jpg"
    },
    "alternative_titles": {
        "titles": [
            {
                "iso_3166_1": "IT",
                "title": "I vendicatori"
            },
            {
                "iso_3166_1": "BR",
                "title": "Os Vingadores"
            },
            {
                "iso_3166_1": "GB",
                "title": "Avengers Assemble"
            },
            {
                "iso_3166_1": "US",
                "title": "Marvel's The Avengers"
            },
            {
                "iso_3166_1": "SE",
                "title": "Avengers 3D"
            },
            {    
               "iso_3166_1": "ES",
                "title": "Marvel Los Vengadores"
            },
            {
                "iso_3166_1": "PL",
                "title": "Avengers 3D"
            },
            {
                "iso_3166_1": "IL",
                "title": ""
            },
            {
                "iso_3166_1": "US",
                "title": "The Avengers 3D"
            },
            {
                "iso_3166_1": "CZ",
                "title": "Avengers"
            },
            {
                "iso_3166_1": "TW",
                "title": ""
            },
            {
                "iso_3166_1": "DE",
                "title": "Marvel's The Avengers - Die Rächer"
            },
            {
                "iso_3166_1": "DE",
                "title": "The Avengers - Die Rächer"
            },
            {
                "iso_3166_1": "VE",
                "title": "Los Vengadores"
            }
        ]
    }
}

Et j'ai essayé d'obtenir un des titres alternatifs, j'ai essayé avec ma méthode par défaut...
result("movie.json",".alternative_titles.titles.0.title") mais null est ce que j'ai obtenu...

Je l'ai donc utilisé pour
result("movie.json",".alternative_titles.titles") pour vérifier le résultat et le résultat était

[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]

Après un certain temps à essayer de comprendre ce qu'il fallait faire puisque je ne pouvais pas accéder au sous-objet avec un simple nombre (.1 , .0 ...) j'ai essayé de créer une fonction pour rendre les choses un peu plus faciles, mais sans succès :

Function filejson(json) 
  On Error Resume Next
  Dim objStream, strData 
  Set objStream = CreateObject("ADODB.Stream") 
  objStream.CharSet = "utf-8" 
  objStream.Open 
  objStream.LoadFromFile(json) 
  strData = objStream.ReadText()
  filejson=strData
End Function 

Function str2json(json,value) 
  On Error Resume Next
  Set scriptControl = CreateObject("MSScriptControl.ScriptControl") 
  scriptControl.Language = "JScript" 
  Set searchResultObject = scriptControl.Eval("(" + json + ")")
  parameters=Split(value,".")
  fullparm="obj"
  obj=Eval("searchResultObject" & fullparm )
  For Each parm in parameters
      MsgBox("Parameter: "&parm&" | Old Object: "& obj)
      If Eval("obj."&parm) = "[object Object]" Then
          If IsNumeric(parm) Then
              i=0
              For Each new_obj in obj
                  If Trim(i) = Trim(parm) then
                      MsgBox("New Object: " & "obj | Value: " & new_obj)
                      obj=new_obj
                      fullparm="obj."
                  End If
                  i=i+1
               Next
          Else
              obj=Eval("obj." & parm)
              fullparm=fullparm&"."&parm
              MsgBox("New Object: " & "obj." & parm & " | Value: " & obj)
          End If
      Else
          str2json=obj
          Exit Function
      End If
  Next
  MsgBox(fullparm)
  str2json="false"
End Function
Function result(json,value)
    On Error Resume Next
    result=str2json(filejson(json),value)
End Function

Avez-vous des idées pour obtenir la valeur que je veux en ayant simplement la même entrée ?

"alternative_titles.titles.0.title" (obtenir 1 sous-objet.title).
Il pourrait aussi avoir plus d'une sous-dimension...jsons....

Et je dois utiliser VBScript et non JScript. Il est utilisé dans les combojects.
avec JScript, il n'est pas capable d'ouvrir un fichier avec UTF8. En VBScript, c'est avec ADODB.Stream.

0voto

Stephen Quan Points 4429

Il y a quelque temps, j'ai écrit un convertisseur JSON vers XMLDOM (voir Décoder/encoder JSON avec VBScript ). Lorsqu'il est appliqué à votre JSON, il produit le XMLDOM suivant :

<OBJECT adult="false" backdrop_path="/hbn46fQaRmlpBuUrEiFqv0GDL6Y.jpg">
    <OBJECT id="86311" name="The Avengers Collection" poster_path="/qJawKUQcIBha507UahUlX0keOT7.jpg" backdrop_path="/zuW6fOiusv4X9nnW3paHGfXcSll.jpg"/>
    <OBJECT>
        <ARRAY>
            <OBJECT iso_3166_1="IT" title="I vendicatori"/>
            <OBJECT iso_3166_1="BR" title="Os Vingadores"/>
            <OBJECT iso_3166_1="GB" title="Avengers Assemble"/>
            <OBJECT iso_3166_1="US" title="Marvel's The Avengers"/>
            <OBJECT iso_3166_1="SE" title="Avengers 3D"/>
            <OBJECT iso_3166_1="ES" title="Marvel Los Vengadores"/>
            <OBJECT iso_3166_1="PL" title="Avengers 3D"/>
            <OBJECT iso_3166_1="IL" title=""/>
            <OBJECT iso_3166_1="US" title="The Avengers 3D"/>
            <OBJECT iso_3166_1="CZ" title="Avengers"/>
            <OBJECT iso_3166_1="TW" title=""/>
            <OBJECT iso_3166_1="DE" title="Marvel's The Avengers - Die Rächer"/>
            <OBJECT iso_3166_1="DE" title="The Avengers - Die Rächer"/>
            <OBJECT iso_3166_1="VE" title="Los Vengadores"/>
        </ARRAY>
    </OBJECT>
</OBJECT>

En tant que XMLDOM, il devrait être simple d'utiliser XPath et selectSingleNode pour obtenir les valeurs souhaitées. Par exemple : Sélectionner un nœud unique avec un nom d'attribut en vbscript

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X