Как разобрать JSON с VBA без внешних библиотек?

У меня есть 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 содержит значения, подобные приведенным ниже (отмеченные в часах):

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 заменяет sentences на sentences, во-вторых (когда я пытался вручную изменить json), он все еще не позволяет использовать sentenses(0).

Ответ 1

Я нашел этот пример сценария полезным (из 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

Ответ 2

Используя функции JavaScript для разбора JSON, поверх ScriptControl, мы можем создать парсер в VBA, который будет перечислять каждую точку данных внутри JSON. Независимо от того, насколько вложенной или сложной структура данных, пока мы предоставляем действительный JSON, этот анализатор вернет полную древовидную структуру.

JavaScripts Методы Eval, getKeys и getProperty предоставляют строительные блоки для проверки и чтения JSON.

В сочетании с рекурсивной функцией в VBA мы можем перебирать все ключи (вплоть до n-го уровня) в строке JSON. Затем, используя элемент управления Tree (используемый в этой статье) или словарь или даже на простом листе, мы можем упорядочить данные JSON по мере необходимости.

Полный код здесь: JSON Parser в VBA

Ответ 3

Назовите меня простым, но я только что объявил вариант и разделил текст ответа из моего REST GET на кавычку кавычки между каждым элементом, а затем получил желаемое значение, ища последнюю цитату с InStrRev. Я уверен, что это не так элегантно, как некоторые другие предложения, но это работает для меня.

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

Ответ 4

в приведенном выше примере - замена [и] на (и), похоже, работает. Хотя это не строго формат JSON.

Затем укажите его с помощью arr.sentences.trans

Обратите внимание, что я изменил свое предложение на предложения2, поскольку предложения, похоже, зарезервированы для встроенного свойства.