Разбор JSON

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
472
@lmike
У меня была идея автоматизировать преобразование значений, в которых приходит дата в определённом установленном формате, в поле с типом DateTime, но отказался от этой идеи, т.к. это не всегда нужно. В принципе я всегда знаю, какие поля мне нужно преобразовывать, а какие нет.
Вот и здесь я предлагаю не править общий код, а откорректировать пути уже после преобразования - заменить один слеш на два, если это нужно. Код могу поискать, который производит замену, учитывая количество вхождений.
"беда" в том что я получаю массив из путей, и преобразование вызывается "внутри механизма"
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
233
"беда" в том что я получаю массив из путей, и преобразование вызывается "внутри механизма"
Но ты ж знаешь в каком поле json'а это массив? Вот уже после преобразования можно в цикле пройтись по массиву и восстановить его. А иначе я не знаю, как можно определить, заменять "\t" на табуляцию или нет. (зачёркнуто как бредовая идея - все значения уже изменились внутри класса, потому что-то восстанавливать на выходе уже бесполезно)
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
233
Код парсера обновлён.
Это глобальный рефакторинг, потому версию поднял до 3.0.

Ребята, всем спасибо за код, помощь и идеи!
Единственное, что здесь не решено, это проблема с повреждением путей (@lmike). Я всё помню, есть идея, ещё обсудим.

Сорри, что не сразу выложил код, как доработал... всё не хватало времени. Зато за это время код отлично показал себя в работе! :)
 
Последнее редактирование:
  • Нравится
Реакции: lmike, rinsk и alexas1

savl

Lotus Team
28.10.2011
2 624
314
BIT
542
Появился еще один вариант:
Когда потом появиться нормальный репозиторий, я обновлю ссылку.
 
Последнее редактирование:
  • Нравится
Реакции: Иван Пахомов

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
233
Это обвязка над новыми классами NotesJSONNavigator и т.д.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
472
учитывая что создание дока "дорогая" операция, а не всегда нужен новый док (временный для поиска по полям в БД и апдейта), забульбенил расширенную ф-цию
Visual Basic:
%REM
    Function JSON_parseToDocumentExt
    Description: if bReuse is true - create document once
%END REM
Public Function JSON_parseToDocumentExt(sJSON As String, ndbTrg As NotesDatabase,bReuse As Boolean) As NotesDocument
    Static doc As NotesDocument
    On Error GoTo ErrH
    Dim oJson As JSONList
    Set oJson = JSON_parse(sJSON, True)
  
    Dim ndNew As NotesDocument, bNew As Boolean
    bNew=False
    If bReuse And doc Is Nothing Then
        Set doc=ndbTrg.CreateDocument()
        bNew=true
    End If
    If bReuse Then
        If Not bNew Then
            Dim itms() As NotesItem, i As Integer
            ReDim itms(UBound(doc.Items)) As NotesItem
            ForAll itm In doc.Items
                Set itms(i)=itm
                i=i+1
            End ForAll
            ForAll tmp In itms
                Call tmp.Remove()
            End ForAll
        End If
        Set ndNew=doc
    Else
        Set ndNew = ndbTrg.CreateDocument()
    End If
  
    If JSON_setToDocument(oJson, ndNew) Then
        Set JSON_parseToDocumentExt = ndNew
    End If
    Exit Function
ErrH:
    Error Err, RaiseError
End Function
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
233
учитывая что создание дока "дорогая" операция, а не всегда нужен новый док (временный для поиска по полям в БД и апдейта), забульбенил расширенную ф-цию
Имеется в виду NotesDatabase.CreateDocument? На сколько я помню, это вроде нетрудоёмкая операция, это ж не Save, при котором данные кодируются, бьются на чанки, и в базе под них выделяется место. Док же в нашем случае не сохраняется.
Если делать 2 цикла по полям, очищая предыдущий док, это реально быстрее? Есть замеры?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
472
Имеется в виду NotesDatabase.CreateDocument? На сколько я помню, это вроде нетрудоёмкая операция, это ж не Save, при котором данные кодируются, бьются на чанки, и в базе под них выделяется место. Док же в нашем случае не сохраняется.
Если делать 2 цикла по полям, очищая предыдущий док, это реально быстрее? Есть замеры?
замеры не делал...
при создании дока там емнип время на сервер убегало (на 7-ке точно, щас - не смотрел)
что касается полей - теоретически можно в один цикл, или ваще не очищать - если получаемые наборы одинаковые, эт я для "гарантии" ;)
 
  • Нравится
Реакции: VladSh

chivononok

New member
03.04.2023
1
0
BIT
7
добрый день.
при попытке распарсить такой json при помощи библиотеки (LSJsonParser v.3, довольно удобно, спасибо за проделанную работу)

Код:
{
    "DATA": {
        "BINDS": [],
        "VALS": [
            {
                "ID": 111,
                "CODE": "aa"
            }
        ]
    }
}

получаю ошибку: JSON_PARSE(11) -> PARSE(262) -> Invalid JSON format: Out of stack space (28).
Возможно сможете подсказать, как поправить?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
472
при попытке распарсить такой json...

получаю ошибку: JSON_PARSE(11) -> PARSE(262) -> Invalid JSON format: Out of stack space (28).
Возможно сможете подсказать, как поправить?
я не помню точно... там рекурсивная ф-ция, мб она циклится
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
233
Код парсера обновлён.
Изменения серьёзные, потому версию поднял до 4.0.

@chivononok
Ошибка исправлена.

@lmike

По поводу замены предложенной JSON_parseToDocumentExt на JSON_parseToDocumentSame, которая без параметра bReuse As Boolean - всё равно две функции, потому в параметре смысла не вижу. Тем более, что использование очень сильно отличается от стандартного (в описание функции). То есть, в зависимости от задачи, вызываем или одну или другую функцию.

По проблеме повреждения путей при постобработке unescape-символов.
Не хотел смешивать разбор json и постобработку, т.к. не очень хорошая идея, если класс делает несколько работ вместо одной... но не смог от этого уйти, потому что:
- во-1, json м.б. сложной структуры, и вовне его обработать будет уже сложнее;
- во-2, проверка элементов на то, нужно ли делать постобработку, делается внутри JSONParser.findElementString, и не хотелось нагружать ещё одним проходом...
Чтобы быстрее разобраться, как оно работает см. 2 доп. параметра в JSON_parse, а также константы UNESCAPE_RULE_... и доп. классы UnEscapeEngine...

Пример кода:
Visual Basic:
Dim s As String
s = |{"name":"Нэйма!","text":"Жучка-туручка \"вздрючила\" чучку.","path":"C:\\Program Files\\Apache Software Foundation\\Tomcat 9.0\\temp\\out9035214262981997167.pdf"}|
Dim lstUnescFields List As String
lstUnescFields("path") = UNESCAPE_RULE_PATH
Dim oJson As JSONList
Set oJson = JSON_parse(s, "", UNESCAPE_RULE_SIMPLE, lstUnescFields)
ForAll item In oJson.Items()
    Print ListTag(item), item
End ForAll

В JSON_parse передаётся правило UNESCAPE_RULE_SIMPLE для обработки по умолчанию, а конкретно для поля "path" передаём правило обработки UNESCAPE_RULE_PATH.
Если для полей правила передавать ненужно (в большинстве случаев достаточно заданного правила по умолчанию), то в последнем параметре передаём Null.

Ребята, всем спасибо за код, помощь и идеи!
 
  • Нравится
Реакции: lmike
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!