Ассоциация ЭБНИТ    ИРБИС-корпорация    Вики-Ирбис    Online/CHM справка Ирбис   
Опыт и разработки пользователей ИРБИС :  ИРБИС Irbis
 
Формирование json форматом
Пользователь: Gena (IP-адрес скрыт)
Дата: 02, November, 2020 10:40

Периодически возникает задача сформировать JSON с данными из Ирбиса. Например, если используется ВебИрбис в качестве источника данных для внешней системы, или если строить некое АПИ, например, для того же RESTfull API. В связи с этим появилось вот такое решение задачи. Оно удобно в первую очередь тем, что там наглядно видно формирование параметров, и его легко можно адаптировать под любые задачи. В приведенном примере создается объект пользователя, содержащий параметры и массив значений.



/* В переменную 1 пишем связки <ИмяПараметра>:<ЗначениеПараметра>/
/* в конце строки обязательно знак слеша - это переход на новую строку,
/* а в этом варианте - знак окончания данных параметра
&uf('+7w1#'
    'userName:'v10," "v11," "v12/
    'category:'v50/
    'dateRegistration:'&uf('av51.8#1')/
),


/* В переменную 2 пишем массив с данными о выданных книгах
/* так как параметров нужно передавать несколько, то каждый из них
/* передается как подполе, а уже в подполе та же структура <ИмяПараметра>:<ЗначениеПараметра>
/* только тут знак слеша - окончание строки - ставится не в конце каждого параметра, 
/* а после заполнения данных одного элемента массива
&uf('+7w2#'
    (if p(v40) then 
        if v40^f:'*' then 
            '^Abrief:'v40^c,
            '^BdateOfIssue:'v40^d
            '^CexpectedReturnDate:'v40^e
            '^DplaceOfIssue:'v40^k
        fi,
    fi/)
),


'{'

/* выводим простые параметры из переменной 1
/* команда if &uf('+90') <> '1' then ',' fi, используется для проставления для всех повторений поля, кроме последнего.
(if g1<>'' then 
    if &uf('+90') <> '1' then ',' fi,
    '"'&uf('g0:'g1)'":"'&uf('g2:'g1)'"'
fi)

/* выводим массив книг, которые записаны в переменной 2
if g2<>'' then 
    '"books":['
    (if g2<>'' then 
        '{'
            '"'&uf('g0:'g2^A)'":"'&uf('g2:'g2^A)'",'
            '"'&uf('g0:'g2^B)'":"'&uf('g2:'g2^B)'",'
            '"'&uf('g0:'g2^C)'":"'&uf('g2:'g2^C)'",'
            '"'&uf('g0:'g2^D)'":"'&uf('g2:'g2^D)'",'
            
        '},'
    fi)
    '],'
fi,

'}'

ниже пример сформированного ответа:

{"userName":"Іванов Іван Іванович", "category":"викладач", "dateRegistration":"", "books":[{"brief":"Механизация и электрификация сельского хозяйства. - Журнал, 2013г. № ","dateOfIssue":"20131016","expectedReturnDate":"20150602","placeOfIssue":"ч.з.Г.к.",}, {"brief":"Бородіна , Ганна Іванівна. Англійська мова [Текст] : підруч. / Г. І. Бородіна , ","dateOfIssue":"20141111","expectedReturnDate":"20150602","placeOfIssue":"Г.к.",}, ],}


проверка в JSON Validator показывает, что он правильный:

{
   "userName":"Іванов Іван Іванович",
   "category":"викладач",
   "dateRegistration":"",
   "books":[
      {
         "brief":"Механизация и электрификация сельского хозяйства. - Журнал, 2013г. № ",
         "dateOfIssue":"20131016",
         "expectedReturnDate":"20150602",
         "placeOfIssue":"ч.з.Г.к."
      },
      {
         "brief":"Бородіна , Ганна Іванівна. Англійська мова [Текст] : підруч. / Г. І. Бородіна , ",
         "dateOfIssue":"20141111",
         "expectedReturnDate":"20150602",
         "placeOfIssue":"Г.к."
      }
   ]
}



Редактировано 2 раз. Последний раз 09.11.2020 09:35 пользователем Gena.

Re: Формирование json форматом
Пользователь: Gena (IP-адрес скрыт)
Дата: 02, November, 2020 10:57

Примечание: в этом варианте нет проверки на запрещенные символы. Их можно чистить или с помощью внешней dll, или форматом. Крайне рекомендую это делать, так как те же названия книг могут содержать кавычки, часто встречаются имена с апострофами, в описании книг в поле 40 могут выводится сведения об ответственности за косой чертой. В том числе, не исключена и ситуация случайного нажатия библиотекарем клавиши слеша при заполнении полей описания читателя. Все эти символы нужно или удалять, или экранировать.

Например, так:
Создаем формат json_escape.pft вот такого содержания:

/*Экранируем апостроф
&uf('+9I!'&uf('+9f39')'!|\'&uf('+9f39')'|'
/*Экранируем двойную кавычку
&uf('+9I!"!|\"|'
/*Экранируем обратный слеш
&uf('+9I!\!|\\|'
/*Экранируем слеш
&uf('+9I!/!|\/|'

    &uf('ag100#1')

)
)
)
)

При формировании параметров используем этот формат, передаем данные через глобальную переменную 100. Ниже пример использования:

&uf('+7w1#'
    'userName:' &uf('+7w100#'v10," "v11," "v12),&uf('6json_escape') /
    'category:'&uf('+7w100#'v50),&uf('6json_escape')/
    'dateRegistration:'&uf('+7w100#'&uf('av51.8#1')),&uf('6json_escape')/
),



Редактировано 1 раз. Последний раз 02.11.2020 11:00 пользователем Gena.

Re: Формирование json форматом
Пользователь: SokV (IP-адрес скрыт)
Дата: 15, February, 2021 14:58

В ИРБИС плюс (а может и в некоторых поздних версиях ИРБИС 64) для кодирования символов предлагается специально для этого сделанный формат
&uf('++1',



Редактировано 1 раз. Последний раз 15.02.2021 14:58 пользователем SokV.

Re: Формирование json форматом
Пользователь: Gena (IP-адрес скрыт)
Дата: 15, February, 2021 15:47

Как здорово, что предлагается, как грустно, что об этом нет ничего в релизах

Re: Формирование json форматом
Пользователь: levaleva (IP-адрес скрыт)
Дата: 13, March, 2022 19:00

Подниму тему JSON.

Вот тут указывается
&unifor('+@')

Однако в редакторе формата он выдает не просто json строку (но зато с экранированием:
0
9#0
0#5
{"10":{"0":{"D":"60.00"}},"6

Коллеги, есть ли где информация о первых трех строках? Первое число второй строки - это кажется mfn.

Re: Формирование json форматом
Пользователь: Gena (IP-адрес скрыт)
Дата: 16, March, 2022 16:22

MFN и номер версии записи

Re: Формирование json форматом
Пользователь: Ivanm (IP-адрес скрыт)
Дата: 31, October, 2022 08:17

Здравствуйте! Попробовал вывести так поля, но вывелись только три первых параметра, книги почему-то не выходят :с
json файл сам:

Цитата:
<?!,

'
{
"value": "',v1000,'",

"nothing": "nothing"
}

',?>


Выполняется вот так:

Цитата:
{"userName":"Меньшиков Иван Сергеевич","category":"^AСпециалисты народного хозяйства^B6. ИТР","dateRegistration":"20170717"}

Если прописать еще параметр по аналогии то почему-то все ломается. Подскажите пожалуйста в чем я ошибся :(

Re: Формирование json форматом
Пользователь: SokV (IP-адрес скрыт)
Дата: 31, October, 2022 13:19

Здравствуйте!

Не понятна конкретика вопроса, что именно не получается. Не понятно, как из

<?!,

'
{
"value": "',v1000,'",

"nothing": "nothing"
}

',?>

может получаться

{"userName":"Меньшиков Иван Сергеевич","category":"^AСпециалисты народного хозяйства^B6. ИТР","dateRegistration":"20170717"}

И что значит ломается.

В принципе что то может ломаться потому, что встречаются какие то символы, которые портят строку JavaScript. Чтобы этого не происходило, вместо

<?!,

'
{
"value": "',v1000,'",

"nothing": "nothing"
}

',?>

рекомендуется формировать JSON так

<?!,

'
{
"value": "',&uf('++1',v1000),'",

"nothing": "nothing"
}

',?>

где &uf('++1', кодирует символы как это принято в JavaScript, чтобы на выходе получалась корректная строка JavaScript.

Re: Формирование json форматом
Пользователь: Ivanm (IP-адрес скрыт)
Дата: 03, November, 2022 10:12

используются фреймы для выдачи информации:

ShowFrames=show_user_queries.frm
SearchFrames=RESULT,user_books_result_json.frm
DBNAME=RDR

Но выводится только информация с:

Цитата:
&uf('+7w1#'
'userName:'v10," "v11," "v12/
'category:'v50/
'dateRegistration:'&uf('av51.8#1')/
),


Тот кусок с формированием json я взял из irbis_server_ft.ini 2020 версии из "ZAPR":

Цитата:
[ZAPR
FRAMES=C:\IRBIS\WEB\catalog.unatlib.org.ru\cgi-bin\Frames\FullText\
ShowFrames=show_search_queries.frm
RecUpdateFrames=RESULT,rec_update_result_json.frm
DBNAME=ZAPR]

Пока что не могу понять почему выходит только часть :(



Извините, только зарегистрированные пользователи могут писать в этом форуме.
This forum powered by Phorum.