Кибор » Кибор - Интегрированная среда разработки ботов » Тестирование Кибор » Тестирование парсера JSON формата

Страниц (2): [1] 2 »
 

1. Kibor - 22 Мая, 2020 - 18:40:38 - перейти к сообщению
На данный момент многие сайты дают возможность взаимодействовать с ними через Api.
Наиболее частый формат взаимодействия является JSON.

В разработке инструмент, который позволит создавать боты общающиеся с сайтами через Api разработчиков сайтов.

На данный момент реализуется парсер JSON формата для возможности получать и выделять необходимую информацию с ответа.

У кого есть желание, тестируется не описанная на данный момент функция parserjson.

Код для тестирования:

CODE:
string исходник="";
string Tt;

if (fopen ("C:\json.txt", "r")!=0)//открываем файл для чтения "r"
{
while (freadline(Tt))исходник=исходник+Tt;
fclose();
}


messagebox (исходник);
messagebox (parserjson(Rez_Json, исходник));


В файле json.txt должен находиться формат JSON.

Пример:
CODE:
{
"firstName": "Иван",
"lastName": "Иванов",
"address":
{
"streetAddress": "Московское ш., 101, кв.101",
"city": "Ленинград",
"postalCode": 101101
},
"phoneNumbers":
[
"812 123-1234",
"916 123-4567",
{
"Info":"No",
"MobPhone":"Yes"
}
]
}


При запуске вышеуказанного кода с таким файлом, Кибор будет выводить распарсенную информацию.
Вывод состоит из пары Ключ = Значение

Доступ к элементам JSON реализован похожим образом как это сделано в JavaScript.

Пример вывода:

lastName ключ. Иванов значение этого ключа
 Цитата:
lastName = Иванов


address.city состоит из двух ключей. address и элемента объекта city
 Цитата:
address.city = Ленинград



phoneNumbers это массив. phoneNumbers[1] указывает на второй элемент массива.
 Цитата:
phoneNumbers[1]=916 123-4567


phoneNumbers[2].Info указывает на третий элемент массива phoneNumbers, в состав которого входит объект. По элементу объекта Info мы узнаем значение.
 Цитата:
phoneNumbers[2].Info = No



Пример сложного формата:

products[1].options.15[0] = 47


 Цитата:
{
"user_id" : 10,
"session_id" : "2c2l3h4ii271aojentejtdcmh3",
"products":
[

{
"product_id" : 15,
"options" :
{
"15" : [45, 47],
"18" : 52
},
"quantity" : 1,
"price" : 1500
},

{
"product_id" : 16,
"options" :
{
"15" : [47,48],
"18" : 51
},
"quantity" : 2,
"price" : 1000
}

]
}



data[0].images[1].url =(для просмотра ссылки Вам необходимо авторизоваться)
data[0].attributes[1].value = 2015

 Цитата:
{
"data": [
{
"id": 123,
"status": "active",
"url": "https://www.olx.ua/oferta/url.html",
"created_at": "2018-02-02 09:35:16",
"activated_at": "2018-02-02 09:32:52",
"valid_to": "2018-03-04 09:32:52",
"title": "This is title",
"description": "This is description",
"category_id": 123,
"advertiser_type": "private",
"external_id": 12345,
"external_url": "http://myshop.com/advert/123",
"contact": {
"name": "John",
"phone": 123123123,
"location": {
"city_id": 1,
"district_id": null,
"latitude": 53.123,
"longitude": 17.123
}
},
"images": [
{
"url": "https://www.olx.ua/advert-picture-1.jpg"
},
{
"url": "https://www.olx.ua/advert-picture-2.jpg"
}
],
"price": {
"value": 123,
"currency": "PLN",
"negotiable": false,
"trade": false
},
"salary": null,
"attributes": [
{
"code": "model",
"value": "cts",
"values": null
},
{
"code": "year",
"value": 2015,
"values": null
}
],
"courier": null
}
]
}


В случае успеха функция по очереди вернет все ключи и значения. Возврат функции 1.

Проверить валидность записи JSON можно тут

В случае ошибки выкладывайте JSON и в каком месте неверно выводит.
2. Dantes3000 - 23 Мая, 2020 - 06:46:22 - перейти к сообщению


В самом конце ошибка.

json (Отобразить)
3. Kibor - 23 Мая, 2020 - 06:50:48 - перейти к сообщению
 Dantes3000 пишет:
В самом конце ошибка.

Функция возвращает число, а не текст.
Запускайте код как есть. Сообщения выводятся внутри Кибор. Это тест.
(Добавление)
В формате ошибка

 Цитата:
"id": 1
"first_name": "sd",


После 1 нет запятой.
Проверяйте на валидность JSON
4. Dantes3000 - 23 Мая, 2020 - 06:56:45 - перейти к сообщению
 Kibor пишет:
После 1 нет запятой.


я поправил. это я уже на форуме редактировал.
(Добавление)
В работе с массивами будет очень полезно адаптировать в кибор такой код: message.photo[-1].file_id чтобы легко получать последний элемент массива
5. Kibor - 23 Мая, 2020 - 07:03:37 - перейти к сообщению
Описывайте идеи. В данный момент парсер тестируется на работоспособность. В дальнейшем будут добавляться нужные удобные функции.
6. Kutuz_off - 23 Мая, 2020 - 14:35:08 - перейти к сообщению
Хорошо бы потом пример применения на простых браузерках, использующих этот метод.
7. Kibor - 24 Мая, 2020 - 03:18:35 - перейти к сообщению
Это используют доски объявлений, букмекерские конторы и тд.
8. Kibor - 02 Июня, 2020 - 15:42:45 - перейти к сообщению
Реализован доступ к объектам JSON

Парсер JSON формата осуществляется функцией
parserjson(Rez_Json, исходник);
где
Rez_Json - Символьное имя объекта
исходник - string, в котором записан Json формат

Затем по символьному имени можно обращаться к структуре Json:
 Цитата:
parserjson(Rez_Json, исходник);
Rez_Json.products[1].options.15[2]


Если элемента не существует, вернется ERROR_SEARCH_JSON
В дальнейшем появятся функции вычисления размеров массивов и тд.

Можно одновременно загружать и создавать несколько Json объектов:
 Цитата:
parserjson(Rez_Json, исходник);
parserjson(Rez_Json_2, исходник1);


Пример:
CODE:
string исходник="";
string исходник1="";
string Tt;

if (fopen ("C:\json.txt", "r")!=0)//открываем файл для чтения "r"
{
while (freadline(Tt))исходник=исходник+Tt;
fclose();
}


if (fopen ("C:\json - 1.txt", "r")!=0)//открываем файл для чтения "r"
{
while (freadline(Tt))исходник1=исходник1+Tt;
fclose();
}

messagebox (исходник);
messagebox (исходник1);

parserjson(Rez_Json, исходник);
parserjson(Rez_Json_2, исходник1);

//Объект Rez_Json
int n=0;
loop()
{
Tt=Rez_Json.products[1].options.15[n];
if (Tt=="ERROR_SEARCH_JSON")break;//Перебор всего массива до ошибки 47,48, 25, 79, 95
messagebox(Tt);
n++;
}

//Объект Rez_Json_2
messagebox(Rez_Json_2.data[0].attributes[1].value);//2015
messagebox(Rez_Json_2.data[0].images[0].url);//https://www.olx.ua/advert-picture-1.jpg


Соответственно файлы
json.txt
CODE:
{
"user_id" : 10,
"session_id" : "2c2l3h4ii271aojentejtdcmh3",
"products":
[
{
"product_id" : 15,
"options" :
{
"15" : [45, 47],
"18" : 52
},
"quantity" : 1,
"price" : 1500
},
{
"product_id" : 16,
"options" :
{
"15" : [47,48, 25, 79, 95],
"18" : 51
},
"quantity" : 2,
"price" : 1000
}
]
}


json - 1.txt
CODE:
{
"data": [
{
"id": 123,
"status": "active",
"url": "https://www.olx.ua/oferta/url.html",
"created_at": "2018-02-02 09:35:16",
"activated_at": "2018-02-02 09:32:52",
"valid_to": "2018-03-04 09:32:52",
"title": "This is title",
"description": "This is description",
"category_id": 123,
"advertiser_type": "private",
"external_id": 12345,
"external_url": "http://myshop.com/advert/123",
"contact": {
"name": "John",
"phone": 123123123,
"location": {
"city_id": 1,
"district_id": null,
"latitude": 53.123,
"longitude": 17.123
}
},
"images": [
{
"url": "https://www.olx.ua/advert-picture-1.jpg"
},
{
"url": "https://www.olx.ua/advert-picture-2.jpg"
}
],
"price": {
"value": 123,
"currency": "PLN",
"negotiable": false,
"trade": false
},
"salary": null,
"attributes": [
{
"code": "model",
"value": "cts",
"values": null
},
{
"code": "year",
"value": 2015,
"values": null
}
],
"courier": null
}
]
}



Вложенные массивы


Перебор всех массивов Rez_Json.members[?].powers[?] в Json
Файл
 Цитата:
{
"squadName": "Super hero squad",
"homeTown": "Metro City",
"formed": 2016,
"secretBase": "Super tower",
"active": true,
"members": [
{
"name": "Molecule Man",
"age": 29,
"secretIdentity": "Dan Jukes",
"powers": [
"Radiation resistance",
"Turning tiny",
"Radiation blast"

]
},
{
"name": "Madame Uppercut",
"age": 39,
"secretIdentity": "Jane Wilson",
"powers": [
"Million tonne punch",
"Damage resistance",
"Superhuman reflexes"

]
},
{
"name": "Eternal Flame",
"age": 1000000,
"secretIdentity": "Unknown",
"powers": [
"Immortality",
"Heat Immunity",
"Inferno",
"Teleportation",
"Interdimensional travel"

]
}
]
}



Скрипт перебора

CODE:
string исходник="";
string Tt;

if (fopen ("C:\json.txt", "r")!=0)//открываем файл для чтения "r"
{
while (freadline(Tt))исходник=исходник+Tt;
fclose();
}



messagebox (исходник);

parserjson(Rez_Json, исходник);

//Объект Rez_Json
int n=0;
int n1=0;
loop()
{
Tt=Rez_Json.members[n].powers[n1];//Перебор всех массивов Rez_Json.members[?].powers[?] в Json
if (Tt=="ERROR_SEARCH_JSON")
{
if (n1==0) break;
n++;
n1=0;
}
else
{
messagebox(Tt);
n1++;
}
}



Узнаем age объекта у которого powers "Damage resistance"

CODE:
string исходник="";
string Tt;

if (fopen ("C:\json.txt", "r")!=0)//открываем файл для чтения "r"
{
while (freadline(Tt))исходник=исходник+Tt;
fclose();
}



messagebox (исходник);

parserjson(Rez_Json, исходник);

//Объект Rez_Json
int n=0;
int n1=0;
loop()
{
Tt=Rez_Json.members[n].powers[n1];//Перебор всех массивов Rez_Json.members[?].powers[?] в Json
if (Tt=="ERROR_SEARCH_JSON")
{
if (n1==0) break;
n++;
n1=0;
}
else
{
//messagebox(Tt);
if (Tt=="Damage resistance")
{
messagebox(Rez_Json.members[n].age);
break;
}
n1++;
}
}
9. Kibor - 03 Июня, 2020 - 03:11:26 - перейти к сообщению
Узнать все name и value массива stats

 Цитата:
{
"playerstats": {
"steamID": "76561198050187807",
"gameName": "ValveTestApp260",
"stats": [
{
"name": "total_kills",
"value": 35179
},
{
"name": "total_deaths",
"value": 30241
},
{
"name": "total_time_played",
"value": 2444377
}
]
}
}



CODE:
string исходник="";
string Tt;

if (fopen ("C:\json.txt", "r")!=0)//открываем файл для чтения "r"
{
while (freadline(Tt))исходник=исходник+Tt;
fclose();
}



parserjson(Rez_Json, исходник);

int n=0;
while (Rez_Json.playerstats.stats[n].name!="ERROR_SEARCH_JSON")
{
messagebox (Rez_Json.playerstats.stats[n].name+" = "+Rez_Json.playerstats.stats[n].value);
n++;
}
10. Zireael - 03 Июня, 2020 - 20:01:36 - перейти к сообщению
json.txt:
 Цитата:
{"code": 200,"lang": "en-ru","text": ["Здравствуй, Мир!"]}

CODE:
string text="Тук, тук";

string исходник="";
string Tt;

if (fopen ("C:\json.txt", "r")!=0)//открываем файл для чтения "r"
{
while (freadline(Tt))исходник=исходник+Tt;
fclose();
}
messagebox (исходник);


parserjson(Rez_Json, исходник);
messagebox(Rez_Json.code);
messagebox(Rez_Json.lang);
messagebox(Rez_Json.text[0]); // обращение к переменной text, а не объекту json

Powered by ExBB FM 1.0 Final