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

VBA .json парсинг

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

Author24 — интернет-сервис помощи студентам
Добрый день.
Используя 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.03.2018, 04:47
Ответы с готовыми решениями:

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

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

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

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

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

У меня пока не получилось обработать ваш пример, может с чем-то не разобрался.
0
5 / 2 / 1
Регистрация: 04.03.2012
Сообщений: 28
18.03.2018, 08:07  [ТС] 3
mc-black,
Это понятно. Сложности не с установкой конвертера. А по коду.
0
2785 / 717 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
18.03.2018, 12:01 4
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 Кб, 191 просмотров)
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
18.03.2018, 23:03 5
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 6
Всем здравствуйте. Подниму тему. Похожий вопрос.
Я чайник, но кнопки нажимать умею, таблицы строю ого-го) 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
784 / 466 / 79
Регистрация: 18.05.2016
Сообщений: 1,244
Записей в блоге: 4
13.08.2020, 11:30 7
Цитата Сообщение от 12340987 Посмотреть сообщение
что я уже читал:
И какой эффект от чтения?
Цитата Сообщение от 12340987 Посмотреть сообщение
Это то что я так или иначе понял
Осталось только начать писать код/процедуру/программу.
Если по ходу дела возникнут вопросы, то их можно задать здесь. И лучше под каждый из вопросов создавать отдельную тему, а не прилепляться к чужим некро-темам.
Первое действие, наверное - сделать так, чтоб в экселе в нужных ячейках нужного листа появлялся хоть какой-то текст. Можно ещё попробовать добиться, чтоб этот текст выглядел, как этого хочется. Затем можно разобраться, как из примеров по ссылкам (у меня они не открываются) получать текст и вставлять в эксель. Так вот эти действия очень простые и банальные. Каждый может освоить их самостоятельно. Про это даже спрашивать на форуме странно.
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
17.08.2020, 16:43 8
Цитата Сообщение от 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 9
Цитата Сообщение от amd48 Посмотреть сообщение
Осталось только начать писать код/процедуру/программу
Цитата Сообщение от Dragokas Посмотреть сообщение
вставьте этот конфиг в любой online beautifier сервис, или любой json reader.
Спасибо за ответы. В экселе вроде получилось. Не совсем так как хотел, но я пошёл дальше и пытаюсь собрать всё на отдельной http страничке

Не могу подправить код страницы
0
4 / 4 / 1
Регистрация: 29.06.2016
Сообщений: 74
25.11.2021, 12:14 10
Мне надо из полученого от сервера 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 минут
Я делаю так и получаю ошибку парсера:

Код
    Dim Json As Object, b As Collection
    Set Json = JsonConverter.ParseJson("RequestHandler.responseText")
    Set b = Json("Name")("fnt")
Ошибка - Expecting '{' or '['
0
help
4253 / 3856 / 782
Регистрация: 13.04.2015
Сообщений: 8,532
25.11.2021, 13:36 11
Вот эти косые слеши - это переводы строк. Вам так прямо сервер и отвечает?
0
4 / 4 / 1
Регистрация: 29.06.2016
Сообщений: 74
25.11.2021, 14:00 12
Да, это ответ от сервера
0
25.11.2021, 14:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.11.2021, 14:00
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru