Получить конкретное значение JSON

Я создаю быстрый сценарий VBA для расшифровки ответа JSON. Это рабочий ноутбук, поэтому на него нельзя установить никакие другие расширения.

Через API я получаю ответ в формате JSON. Пока все работает. Но как мне перечислить ответы только для идентификатора источника 1 (или другого):. Желаемый возврат: «CHEMBL544428».

[{"src_id": "7", "src_compound_id": "31843"}, {"src_id": "1", "src_compound_id": "CHEMBL544428"}, {"src_id": "10", "src_compound_id": "591737"}, {"src_id": "39", "src_compound_id": "CB4389789"}, {"src_id": "22", "src_compound_id": "68551"}, {"src_id": "22", "src_compound_id": "657192"}, {"src_id": "49", "src_compound_id": "PD000053"}, {"src_id": "21", "src_compound_id": "14776141"}, {"src_id": "15", "src_compound_id": "SCHEMBL340474"}, {"src_id": "20", "src_compound_id": "Mianserin-hydrochloride"}, {"src_id": "26", "src_compound_id": "21535-47-7"}, {"src_id": "28", "src_compound_id": "MolPort-003-666-778"}, {"src_id": "31", "src_compound_id": "31005"}, {"src_id": "48", "src_compound_id": "HY-B0188A"}, {"src_id": "14", "src_compound_id": "2X03TN217S"}]

Мой текущий код для возврата полного JSON:

Function GetCmpd(inchi_key As String) As String

'    inchi_Key = "YNPFMWCWRVTGKJ-UHFFFAOYSA-N"

    Dim url as String 'define the API call
    url = "https://www.ebi.ac.uk/unichem/rest/inchikey/" & inchi_key
    On Error GoTo ErrorHandler

'   Dim funtionAccess As Object
    functionAccess = createUnoService("com.sun.star.sheet.FunctionAccess")

    'return the JSON data
    Cmpd_data = functionAccess.callFunction("WEBSERVICE",Array(url))

    GetCmpd = Cmpd_data
    Exit Function

    ErrorHandler:
        GetCmpd = "Error " & Err
        

End Function
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
0
69
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Есть два способа

  1. Возможно, существует какой-то способ контролировать вызов веб-сервиса. Этого мы не можем понять из опубликованного вами кода, но вполне разумно, что он предоставляет некоторый механизм фильтрации.
  2. Отфильтруйте ответ в своем собственном коде. Ответ JSON представляет собой строку, и вы можете манипулировать ею как таковой. Обычно это глупая идея, и вам следует использовать что-то вроде VBA JSON. Это не расширение, и вы можете добавить его в существующий проект Excel. Без этого вам придется делать примерно то же самое, используя такие функции, как InStr, Mid, Left и Right. RegEx также может быть вариантом.

Короче говоря, используйте VBA JSON

Ответ принят как подходящий
  • Вы не устанавливаете никаких расширений. VBA JSON — это базовый файл, вам просто нужно импортировать модуль или скопировать его код.

Инструменты VBA / VBA-JSON

  • В VBE добавьте ссылку: Среда выполнения сценариев Microsoft.

  • Следующий код прочитайте JOSN из ячейки A1 и измените при необходимости.
Sub Demo()
    Dim Json As Object
    Set Json = JsonConverter.ParseJson([a1])
    Debug.Print getSrcId(Json, "1")
End Sub

Function getSrcId(oJson As Object, ByVal src_id As String) As String
    Dim oDic
    For Each oDic In oJson
        If oDic("src_id") = src_id Then
            getSrcId = oDic("src_compound_id")
            Exit For
        End If
    Next
End Function

В последнее время я думал о том, как лучше всего это сделать, и хочу расширить ответ Сэма и обобщить все варианты, которые я видел. В VBA нет функций JSON. Варианты анализа JSON с помощью VBA:

  1. Не используйте JSON. Хотя вас бы здесь не было, если бы вы могли избежать JSON, вы, как правило, можете изменить свои запросы, чтобы заставить API выполнять больше работы — иногда вплоть до возврата отдельных значений.
  2. Используйте строковые функции. Это осуществимо, но утомительно. Возможно, стоит прочитать несколько значений в сочетании с предыдущим вариантом, но более того, вы в конечном итоге заново изобретаете один из следующих вариантов. (Я бы включил в эту категорию использование объекта REGEX из библиотеки VBScript.)
  3. Считайте JSON для другого объекта, а затем используйте методы, поставляемые с этим объектом. У каждого из них есть свои ограничения.
    1. Объекты коллекций и объекты словаря:
      Кажется, это самый популярный метод, и эта библиотека есть на github.
      https://github.com/VBA-tools/VBA-JSON
      Отзывы говорят о том, что в большинстве случаев это работает, но у библиотеки есть проблемы с глубокой вложенностью.
    2. Объект ScriptControl
      Откройте JSON как объект jscript. Вот пример.
      Парсинг JSON в Excel VBA
      Если это сделано наивно, возникнут некоторые проблемы с безопасностью.
      https://exceldevelopmentplatform.blogspot.com/2018/01/vba-parse-json-safer-with-jsonparse-and.html
      Похоже, что здесь также имеется предел глубины вложенности, установленный объектом ScriptControl.
    3. DOM-объект:
      Оберните JSON в XML, а затем загрузите XML в объект DOM.
      https://github.com/omegastripes/VBA-JSON-parser/blob/master/Beta/JSON2XML.bas
      Вероятно, у вас уже есть библиотека MSXML2, если вы выполняете веб-запрос, но вам нужно поработать с Xpath, чтобы получить нужные данные, а JSON должен работать правильно: синтаксический анализатор XML совместим только с XML 1.0, поэтому существуют большие блоки Юникода, разрешенные в JSON, но не разрешенные в XML.
    4. Объект WorkbookQuery:
      Power Query может анализировать JSON
      https://support.microsoft.com/en-us/office/parse-text-as-json-or-xml-power-query-7436916b-210a-4299-83dd-8531a1d5e945
      Power Query можно автоматизировать
      Как автоматизировать запрос мощности в VBA?
      Для этого требуется версия Excel после 2016 года, ссылка на объектную модель Excel и знание языка M.

Другие вопросы по теме