web-dev-qa-db-ja.com

外部ライブラリなしでVBAでJSONを解析する方法は?

私は次のようなjsonを持っています:

_{"sentences":[{"trans":"something ru","orig":"english Word","translit":"Angliyskoye slovo","src_translit":""}], "src":"en","server_time":69}
_

それを解析します:

_Function jsonDecode(jsonString As Variant)
    Set sc = CreateObject("ScriptControl"): sc.Language = "JScript"
    Set jsonDecode = sc.Eval("(" + jsonString + ")")
End Function

Set arr = jsonDecode(txt)
_

結果にはarrに以下のような値が含まれます(Watchesでチェック):

_arr
 - sentences (type: Variant/Object/JScriptTypeInfo)
  - 0 (type: Variant/Object/JScriptTypeInfo)
    - orig (type: Variant/String)
    - trans (type: Variant/String)
    ...
  - Item 1 (type: Variant/Object/JScriptTypeInfo)
    - orig (type: Variant/String)
    - trans (type: Variant/String)
    ...
 - server_time
 - src
_

_arr.src_はうまく機能しますが、どのようにしてarr.sentences(0).transを取得できますか?第一に、VBAはsentencesSentencesに置き換えます。第二に(手動でjsonを変更しようとしたとき)まだsentenses(0)を使用できません。

17
LA_

このスクリプトの例が有用であることがわかりました( http://www.mrexcel.com/forum/Excel-questions/898899-json-api-Excel.html#post4332075 から):

Sub getData()

    Dim Movie As Object
    Dim scriptControl As Object

    Set scriptControl = CreateObject("MSScriptControl.ScriptControl")
    scriptControl.Language = "JScript"

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "http://www.omdbapi.com/?t=frozen&y=&plot=short&r=json", False
        .send
        Set Movie = scriptControl.Eval("(" + .responsetext + ")")
        .abort
        With Sheets(2)
            .Cells(1, 1).Value = Movie.Title
            .Cells(1, 2).Value = Movie.Year
            .Cells(1, 3).Value = Movie.Rated
            .Cells(1, 4).Value = Movie.Released
            .Cells(1, 5).Value = Movie.Runtime
            .Cells(1, 6).Value = Movie.Director
            .Cells(1, 7).Value = Movie.Writer
            .Cells(1, 8).Value = Movie.Actors
            .Cells(1, 9).Value = Movie.Plot
            .Cells(1, 10).Value = Movie.Language
            .Cells(1, 11).Value = Movie.Country
            .Cells(1, 12).Value = Movie.imdbRating
        End With
    End With

End Sub
14
July.Tech

簡単に言えば、Variantを宣言し、各アイテム間の引用コンマ引用でREST GETからresponsetextを分割し、InStrRevで最後の引用を探して必要な値を取得しました。私はそれが他の提案のいくつかほどエレガントではないと確信していますが、それは私のために機能します。

         varLines = Split(.responsetext, """,""")
        strType = Mid(varLines(8), InStrRev(varLines(8), """") + 1)
0
Phil