Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/145: Рейтинг темы: голосов - 145, средняя оценка - 4.50
5 / 2 / 1
Регистрация: 04.03.2012
Сообщений: 28

VBA .json парсинг

18.03.2018, 04:47. Показов 30499. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Используя API получаем ответ от сервера в формате json:
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{"История": {
    "Данные": {
        "Нация": {"type": "string", "bytes": 50, "max_size": 0},
        "Население": {"type": "integer", "bytes": 100, "max_size": 0},
        "Прирост": {"type": "integer", "bytes": 200, "max_size": 0},
        "Культура": {"type": "string", "bytes": 100, "max_size": 0},
    },
    "Заголовки": ["Нация", "Население", "Прирост", "Культура"], 
    "Данные": [
        ["Русские", 140, 1500, "Христианство"],
        ["Китайцы", 3400, 5400, "Буддизм"],
        ["Японцы", 180, 1200, "Конфуцианство"],
    ]
}}
Подключаем в VBA конвертер: https://github.com/VBA-tools/VBA-JSON
Подскажите пожалуйста. Как с его помощью или может быть RegExp вывести:
1) Список заголовков ("Заголовки") в массив?
2) Сами "Данные" построчно в массив?

Мои эксперименты с: MsgBox Json("Данные") ни к чему не привели...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.03.2018, 04:47
Ответы с готовыми решениями:

Парсинг в vba
Как-то не повезло мне найти статьи на эту тему, поэтому надеюсь на вашу помощь. Я сейчас работаю над преобразованием существующего кода в...

Парсинг в vba
Как-то не повезло мне найти статьи на эту тему, поэтому надеюсь на вашу помощь. Я сейчас работаю над преобразованием существующего кода в...

POST запрос с JSON на VBA
Доброго дня! Пытаюсь создать групповой запрос в БДИП ФССП (https://api-ip.fssprus.ru/about) Не могу сообразить, как создать запрос...

11
 Аватар для mc-black
2786 / 718 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
18.03.2018, 08:01
Скачиваете фалы с github, распаковываете архив, импортируете в проект VBA фал с расширением bas. Для работы модуля требуется подключить библиотеку Microsoft Scripting Runtime через меню Tools - References..., далее создаете свой модуль и проверяете пример с github, затем пример переделываете на свои данные. Как-то так.

У меня пока не получилось обработать ваш пример, может с чем-то не разобрался.
0
5 / 2 / 1
Регистрация: 04.03.2012
Сообщений: 28
18.03.2018, 08:07  [ТС]
mc-black,
Это понятно. Сложности не с установкой конвертера. А по коду.
0
 Аватар для mc-black
2786 / 718 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
18.03.2018, 12:01
Medison1, разобрался с парсером. У вас невалидный JSON в примере. Надо убрать две запятые:
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{"История": {
    "Данные": {
        "Нация": {"type": "string", "bytes": 50, "max_size": 0},
        "Население": {"type": "integer", "bytes": 100, "max_size": 0},
        "Прирост": {"type": "integer", "bytes": 200, "max_size": 0},
        "Культура": {"type": "string", "bytes": 100, "max_size": 0}
    },
    "Заголовки": ["Нация", "Население", "Прирост", "Культура"], 
    "Данные": [
        ["Русские", 140, 1500, "Христианство"],
        ["Китайцы", 3400, 5400, "Буддизм"],
        ["Японцы", 180, 1200, "Конфуцианство"]
    ]
}}
Код VBA в Excel
Visual Basic
1
2
3
4
5
6
7
8
9
10
Option Explicit
 
Sub test()
    Dim Json As Object, b As Collection, c As Variant
    Set Json = JsonConverter.ParseJson(ThisWorkbook.Worksheets(1).[A1])
    Set b = Json("История")("Заголовки")
    For Each c In b
        Debug.Print c
    Next
End Sub
Вложения
Тип файла: zip JSON_test.zip (53.5 Кб, 206 просмотров)
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
18.03.2018, 23:03
Medison1, вы можете использовать JsonBag от dilletante (vbforums). Ссылку давать запрещено правилами форума.

Этот класс поддерживает некоторые невалидные Json, в т.ч. ваш случай.

Использование: подключить файл JsonBag.cls к проекту (правый клик -> Import File...).

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Option Explicit
 
Sub test()
    Dim i As Long
    Dim JB As JsonBag
    Set JB = New JsonBag
    
    JB.JSON = ThisWorkbook.Worksheets(1).[A1]
    
    With JB.Item("История")("Заголовки")
        For i = 1 To .Count
            Debug.Print .Item(i)
        Next
    End With
End Sub
0
0 / 0 / 0
Регистрация: 18.06.2016
Сообщений: 11
12.08.2020, 15:15
Всем здравствуйте. Подниму тему. Похожий вопрос.
Я чайник, но кнопки нажимать умею, таблицы строю ого-го) Ubuntu слегка знаю) Языки не знаю.
Так вот дело такое:
Есть у меня GET запрос вида http://api_host:port/api/v1/status
Разрабы софта всё сделали чтоб нам удобнее было читать по API
т.е. я с открытого порта устройства получаю ответ вида (немного изменил чтоб непонятно было что это))
Кликните здесь для просмотра всего текста

{
"treetshot": {
"devices": [
{
"a": 2,
"a2": 0,
"c": 16020,
"co": 1000,
"f": 407,
"f1": 5.859799716605649,
"fi": 0,
"h": "217.1 M",
"h2": "36.19 M",
"h2_raw": 36190716.266428046,
"hraw": 217144297.59856823,
"id": 0,
"info": "TwoPik070",
"mk": 68001,
"mn": 86,
"pid": 111,
"pr": 1088,
"r11": 0,
"r12": 0,
"tee": 742
},
{
"a": 2,
"a2": 0,
"c": 16020,
"co": 1000,
"f": 407,
"f1": 5.859799716605649,
"fi": 0,
"h": "217.1 M",
"h2": "36.19 M",
"h2_raw": 36190716.266428046,
"hraw": 217144297.59856823,
"id": 1,
"info": "TwoPik070",
"mk": 68001,
"mn": 86,
"pid": 111,
"pr": 1088,
"r11": 0,
"r12": 0,
"tee": 742
}
],
"to777": "70448 M",
"to7772": "1658584.4 M",
"to7772_raw": 1647474395439.13815895,
"t7777_raw": 7082525044466.8349969,
"to777_e": 839
},
"r_times": 0,
"s_time": 15444446946414619,
"str": {
"aces": 2,
"accs2": 0,
"alm": "hn4s_7et",
"di": "8772.59 G",
"di2": "255278.59 G",
"dne": true,
"lay": 221,
"ly2": 0,
"rees": 0,
"rees2": 0,
"url": "hfgroke.hrk.htbtee.com:3384",
"url2": "rgrgwefvo.hrk.htbtee.com:3353",
"use_ssl": false,
"use_ssl2": false,
"user": "test",
"user2": "test"
},
"version": "4.0.0"
}


в обычном браузере если ввожу iport то получаю готовый результат, обновляемый каждые 10 секунд

Так вот что мне нужно сделать

1. Хотя бы - развернуть этот ответ в эселе (чтоб читаемо было обычному пользователю)

2. Хорошо бы - получать ответы с нескольких аналогичных устройств (не только разные id, но и с другого iport) и выводить это в эксель на один лист и обновлять каждые 10 секунд

3. Вышка - отображать данные с нескольких аналогичных устройств на каком нибудь сайтике (т.е. допустим VPS или свой сервачёк опрашивает порты и потом инфу публикует в удобном виде в инете)

Красоты не не нужно - главное понятно и на века

что я уже читал:
https://codingislove.com/excel-json/
https://codingislove.com/http-requests-excel-vba/

и посмотрел этот видос
https://www.youtube.com/watch?... uHoA0NaO6o

Это то что я так или иначе понял) Еще кое что читал, но мало понимал)

Мне бы понять) Чтоб в случае чего всё проделать заново.

Понятных для меня русскоязычных примеров не нашёл.

Может что то подскажете?
0
 Аватар для amd48
845 / 475 / 80
Регистрация: 18.05.2016
Сообщений: 1,266
Записей в блоге: 5
13.08.2020, 11:30
Цитата Сообщение от 12340987 Посмотреть сообщение
что я уже читал:
И какой эффект от чтения?
Цитата Сообщение от 12340987 Посмотреть сообщение
Это то что я так или иначе понял
Осталось только начать писать код/процедуру/программу.
Если по ходу дела возникнут вопросы, то их можно задать здесь. И лучше под каждый из вопросов создавать отдельную тему, а не прилепляться к чужим некро-темам.
Первое действие, наверное - сделать так, чтоб в экселе в нужных ячейках нужного листа появлялся хоть какой-то текст. Можно ещё попробовать добиться, чтоб этот текст выглядел, как этого хочется. Затем можно разобраться, как из примеров по ссылкам (у меня они не открываются) получать текст и вставлять в эксель. Так вот эти действия очень простые и банальные. Каждый может освоить их самостоятельно. Про это даже спрашивать на форуме странно.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
17.08.2020, 16:43
Цитата Сообщение от 12340987 Посмотреть сообщение
1. Хотя бы - развернуть этот ответ в эселе (чтоб читаемо было обычному пользователю)
А зачем? Оно и так читаемо, вставьте этот конфиг в любой online beautifier сервис, или любой json reader.
Но если так хочется разложить в excele-е:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Option Explicit
 
Const JSON_FILE As String = "1.txt"
 
Public Sub Main()
    
    JSON_ParseFile ThisWorkbook.Path & "\" & JSON_FILE
    
End Sub
 
Public Sub JSON_ParseFile(sFile As String)
    Dim JB As JsonBag
    Set JB = New JsonBag
    
    JB.JSON = FileReadContents(sFile)
    JSON_ParseBag JB, , 1
    
    Set JB = Nothing
End Sub
 
Private Sub JSON_ParseBag(JB As JsonBag, Optional y&, Optional x&)
    
    Dim i As Long
    For i = 1 To JB.Count
 
        y = y + 1
        ThisWorkbook.ActiveSheet.Cells(y, x) = JB.Name(i)
        
        If JB.ItemIsJSON(i) Then
            JSON_ParseBag JB(i), y, x + 1
        Else
            ThisWorkbook.ActiveSheet.Cells(y, x + 1) = JB.Item(i)
        End If
    Next
End Sub
 
Private Function FileReadContents(sFile$) As String
    Dim ff%
    ff = FreeFile()
    Open sFile For Input As #ff
    FileReadContents = Input$(LOF(ff), ff)
    Close #ff
End Function
Положите 1.txt с json конфигом рядом с xlsm и подключите JsonBag.cls (от dilletante).

Обычно, это редко когда требуется, т.к. чаще нужны данные из-под конкретных нод.
0
0 / 0 / 0
Регистрация: 18.06.2016
Сообщений: 11
17.08.2020, 19:38
Цитата Сообщение от amd48 Посмотреть сообщение
Осталось только начать писать код/процедуру/программу
Цитата Сообщение от Dragokas Посмотреть сообщение
вставьте этот конфиг в любой online beautifier сервис, или любой json reader.
Спасибо за ответы. В экселе вроде получилось. Не совсем так как хотел, но я пошёл дальше и пытаюсь собрать всё на отдельной http страничке

Не могу подправить код страницы
0
4 / 4 / 1
Регистрация: 29.06.2016
Сообщений: 81
25.11.2021, 12:14
Мне надо из полученого от сервера JSON вытащить определённые значения. Вот что я получаю в ответ от сервера:

JSON
1
{"result":0,"msg":"Valid DCC Code","protocol_id":2,"org_id":3001,"code_uid":"HC1#DCC-MrT00mhDxLQ=#v#LV","organisation":{"domain":"DCC Key:32B4F4D26843C4B4","name":"HC1 DCC","scheme":"HC1"},"pdc_data":"{\"content\":[{\"c\":[\"Name\",\"Ivanov\"],\"t\":\"t2\"}],\"cert_name\":\"\"}\n","validated_payload":"{\"exp\":1666957800,\"iat\":1635421800,\"iss\":\"LV\",\"hcert\":{\"eu_dgc_v1\":{\"ver\":\"1.3.0\",\"nam\":{\"gn\":\"Vasilij\",\"gnt\":\"VASILIJ\",\"fn\":\"Ivanov\",\"fnt\":\"IVANOV\"},\"dob\":\"*\",\"v\":[{\"ci\":\"*\",\"tg\":\"840539006\",\"ma\":\"ORG-100001417\",\"dn\":1,\"sd\":1,\"is\":\"some name\",\"vp\":\"J07BX03\",\"mp\":\"EU/1/20/1525\",\"dt\":\"2021-10-25\",\"co\":\"LV\"}]}}}\n"}
Мне надо вытащить и result (в JSON это 0), gnt (в JSON это VASILIJ), fnt (в JSON это IVANOV), iss (в JSON это LV), dt (в JSON это 2021-10-25).

Модуль из GitHub я импортирвал, но далее не могу разобраться.

Добавлено через 7 минут
Я делаю так и получаю ошибку парсера:

Code
1
2
3
    Dim Json As Object, b As Collection
    Set Json = JsonConverter.ParseJson("RequestHandler.responseText")
    Set b = Json("Name")("fnt")
Ошибка - Expecting '{' or '['
0
run
 Аватар для I can
4914 / 4528 / 837
Регистрация: 13.04.2015
Сообщений: 9,657
25.11.2021, 13:36
Вот эти косые слеши - это переводы строк. Вам так прямо сервер и отвечает?
0
4 / 4 / 1
Регистрация: 29.06.2016
Сообщений: 81
25.11.2021, 14:00
Да, это ответ от сервера
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.11.2021, 14:00
Помогаю со студенческими работами здесь

VBA парсинг и импорт в столбец excel
Всем привет. Решил сделать парсинг сайта: https://2gis.ru/ekaterinburg/rubrics На данный момент реализовал простой вариант: Записываю в...

Множественная выборка JsonConverter, парсер VBA-JSON
Привет всем! Подскажите пожалуйста, тестирую модуль JsonConverter , не могу перескочить на следующее выражение Json. Сайт выводит Json...

Парсинг JSON в JSON Linked Data с использованием Hydra Java
Есть веб страница, на которой пользователь заполняет поля, жмет на кнопку и затем данные отправляются на сервер. На сервере работает...

Парсинг JSON с short.pub посредством NewtonSoft.Json
Доброго времени суток. Имеется сокращалка сайтов short.pub, у которой есть API, который возвращает JSON, содержащий сокращённые ссылки...

[Newtonsoft.Json] Парсинг JSON-ответа
Здравствуйте уважаемые участники сообщества "CyberForum" ! У меня возникла небольшая проблема. Я перелопатил кучу форумов и 15 страниц...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru