cJSON: Метод ToGroup() и списки

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Основной тред
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8016
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

cJSON: Метод ToGroup() и списки

Сообщение Игорь Столяров »

Добрый день !
v1.47 (06.10.2024): ToGroup internally calls json::DeepClear.
Если позволите - ещё один старый вопрос, который сильно ухудшает качество кода.
Смотрим первые две строчки в штатном примере QueueInGroupTest.clw
CODE
!- initialize queue references
PersonGrp.Addresses &= AddressQ
PersonGrp.Phones &= PhonesQ
Но ведь это обман ... ;) Ну или абсолютно пустое действие - эти указатели будут сразу затёрты ToGroup()
и любое обращение к ним закончится мусором или GPF.

На стороне метода ToGroup() есть имена полей с указателями списков и собственно сами указатели.
Почему нельзя после очистки GROUP сразу восcтановить обратно указатели на списки и сохранить
инициализацию вложенных списков в GROUP ?

Код: Выделить всё

  PersonGrp.Addresses  &= (Addr::Inst)
  PersonGrp.Phones     &= (Phones::Inst)
Спасибо за рассмотрение вопроса. :)
Make Clarion Great Again ! 😎
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3284
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 48 раз
Контактная информация:

cJSON: Метод ToGroup() и списки

Сообщение Дед Пахом »

Было CLEAR, теперь json::DeepClear, принципиально ничего не изменилось. Хотите обновлённый штатный пример QueueInGroupTest.clw?
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8016
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

cJSON: Метод ToGroup() и списки

Сообщение Игорь Столяров »

Нет. Я спрашиваю можно ли в методе ToGroup() восстанавливать указатели на вложенные списки
после выполнения json::DeepClear (ранее CLEAR). :)
Make Clarion Great Again ! 😎
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3284
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 48 раз
Контактная информация:

cJSON: Метод ToGroup() и списки

Сообщение Дед Пахом »

Посмотрим.
С уважением, ДП
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3284
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 48 раз
Контактная информация:

cJSON: Метод ToGroup() и списки

Сообщение Дед Пахом »

А давайте вы напишете, чё всё я.
С уважением, ДП
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

cJSON: Метод ToGroup() и списки

Сообщение Admin »

Дед Пахом писал(а): 07 Октябрь 2024, 22:14 А давайте вы напишете, чё всё я.
Ахаха. Пора принимать пулл реквесты!
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8016
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

cJSON: Метод ToGroup() и списки

Сообщение Игорь Столяров »

Дед Пахом писал(а): 07 Октябрь 2024, 22:14 А давайте вы напишете, чё всё я.
Это батл ! :) Хотя кого я пытаюсь обмануть, здесь работы на 15 минут даже для меня ... ;)

Предположим, я хочу засабклассить метод ToGroup() что бы он не затирал указатели на вложенные списки.
(*) - Маленькое допущение: что бы не замыливать идею - я не буду копировать сюда код распарса Options.

Код: Выделить всё

ToGroup  PROCEDURE(STRING pJson, *GROUP pGrp, BOOL pMatchByFieldNumber = FALSE, <STRING pOptions>) !, BOOL, PROC
BRetVal  Bool
Json     cJSONFactory
fldRef   ANY, AUTO
i        LONG, AUTO

qSaveList Queue
Number      Long
FldList     Any
          end
  Code
  
  ! Сохраняем указатели на вложенные списки в pGrp
  LOOP i=1 TO 99999
    fldRef &= WHAT(pGrp, i)
    IF fldRef &= NULL then Break.

   !If fldRule.Instance    ! (*) Здесь фильтр по наличию тега "Instance" в Options для поля в pGrp    
    If InRange(i,2,3)  
    
       Clear(qSaveList)
       qSaveList.Number  = i
       qSaveList.FldList = fldRef
       Add(qSaveList)  
    end
  end  
  
  ! Собственно вызываем SELF метод для распарса
  BRetVal = Json.ToGroup(pJson, pGrp, pMatchByFieldNumber, pOptions)
  
  ! И восстанавливаем указатели на вложенные списки в pGrp
  Loop i = Records(qSaveList) to 1 by -1
    Get(qSaveList,i)
    
    ! Если в pGrp есть поле с номером qSaveList.Number -> восстановить указатель на список
    fldRef &= WHAT(pGrp, qSaveList.Number)        
    If Not fldRef &= NULL then fldRef = qSaveList.FldList. 
       
    qSaveList.FldList &= Null  ! Очистка ANY поля
    Delete(qSaveList)
  end  
  
  Return BRetVal
И вот теперь да, мы можем без GPF работать с вложенными списками в любезно представленном Вами примере:

Код: Выделить всё

TestPublic  Routine
  Data
Parser  cJSONFactory

!- json string
testString                      STRING('{{"name": "Carl", "addresses": [{{"city": "Rivercity","street": "Main st","house": 123},{{"city": "Rivertown","street": "Park st","house": 987}], "phones": ["1234567", "7654321"]}')

TypeAddressQ                    QUEUE,Type
City                              STRING(20)
Street                            STRING(20)
House                             LONG
                                END
!- address queue
AddressQ                        QUEUE(TypeAddressQ).

!- phone queue
TypePhonesQ                     QUEUE,Type
Phone                             STRING(20)
                                END

PhonesQ                         QUEUE(TypePhonesQ).

!- person group
PersonGrp                       GROUP
Name                              STRING(20)
Addresses                         &TypeAddressQ  !- reference to AddressQ
Phones                            &TypePhonesQ   !- reference to PhonesQ
                                END

Addr::Inst                      LONG, AUTO    !- INSTANCE(AddressQ, THREAD())
Phones::Inst                    LONG, AUTO    !- INSTANCE(PhonesQ, THREAD())


qIndex                          LONG, AUTO

  CODE
  !- initialize queue references
  PersonGrp.Addresses &= AddressQ
  PersonGrp.Phones &= PhonesQ
    
  !- read instances of queues in this thread
  Addr::Inst = INSTANCE(AddressQ, THREAD())
  Phones::Inst = INSTANCE(PhonesQ, THREAD())
  
  !- parse json
  If ToGroup(testString, PersonGrp, FALSE, '[{{"name":"Phones", "instance":'& Phones::Inst &'},{{"name":"Addresses", "instance":'& Addr::Inst &'}]')

     !- check result
     MESSAGE('Name: '& PersonGrp.Name)
  
  ! РАБОТАЕМ СО СПИСКАМИ В ГРУППЕ !!!
  LOOP qIndex = 1 TO RECORDS(PersonGrp.Addresses)
    GET(PersonGrp.Addresses, qIndex)
    MESSAGE('Address: '& CLIP(PersonGrp.Addresses.City) &', '& CLIP(PersonGrp.Addresses.Street) &', '& AddressQ.House)
  END
  LOOP qIndex = 1 TO RECORDS(PersonGrp.Phones)
    GET(PersonGrp.Phones, qIndex)
    MESSAGE('Phone: '& PersonGrp.Phones.Phone)
  END
  
     MESSAGE('Done')
  end
Возникунт вопросы или потребуются пояснения - непременно спрашивайте ! :)
Make Clarion Great Again ! 😎
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8016
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

cJSON: Метод ToGroup() и списки

Сообщение Игорь Столяров »

Добрый день !

Если позволите - небольшое дополнение.
В предыдущем примере хорошо было бы ещё обрабатывать особое значение для опции "Instance":0

Это позволит:
1. Обозначить список, для которого нужно сохранить указатель, но не нужно загружать в ToGroup();
2. Сохранять значения других установленных указателей внутри GROUP, например &Group, &String и т.д.
3. И даже сохранять значение полей, которые не нужно обрабатывать внутри ToGroup() !
(это следует из самой красивой идеи ANY полей - почему бы не сделать в CJSON из этого классную фишку ?)

К сожалению, мне неизвестен способ, как можно определить, что поле внутри Group - это указатель.
Поэтому должен быть механизм позволяющий как-то управлять этим вручную - код ведь не сложный.
Потому что обращение к ЛЮБОМУ "очищенному" Clear() указателю - это вылет с GPF. :(

Спасибо за прочтение ! :)
Make Clarion Great Again ! 😎
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3284
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 48 раз
Контактная информация:

cJSON: Метод ToGroup() и списки

Сообщение Дед Пахом »

Ну нет так нет.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8016
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

cJSON: Метод ToGroup() и списки

Сообщение Игорь Столяров »

Таки возникли непреодолимые проблемы с прочтением моего примера ?
Или Вы хотите, что бы я вносил изменения для Вас в сам класс ? ;)
Make Clarion Great Again ! 😎
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3284
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 48 раз
Контактная информация:

cJSON: Метод ToGroup() и списки

Сообщение Дед Пахом »

Для меня?
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8016
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

cJSON: Метод ToGroup() и списки

Сообщение Игорь Столяров »

Я хотел донести до Вас вопросы, которые возникают у меня при просмотре сделанных
Вами примеров c демонстрацией возможностей класса сJSON (см. первое сообщение).

И прошу Вас рассмотреть предлагаемые мною решения этих вопросов.
Если Вы считаете, что с примером всё хорошо - просто скажите и проехали. :)
Make Clarion Great Again ! 😎
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3284
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 48 раз
Контактная информация:

cJSON: Метод ToGroup() и списки

Сообщение Дед Пахом »

Да рассмотрел я ваши примеры.
Код сохранения значений не рабочий хотя бы для случая вложенных массивов групп. Только не надо говорить, что в таких массивах никто не будет хранить ссылки на очереди.
Игорь Столяров писал(а): 08 Октябрь 2024, 13:57 Хотя кого я пытаюсь обмануть, здесь работы на 15 минут даже для меня ...
...
(*) - Маленькое допущение: что бы не замыливать идею - я не буду копировать сюда код распарса Options.
Если бы вы потратили 16 минут, то нашли бы метод ToGroup, в котором уже есть распарсенные опции, а не первый попавшийся. Плюс -в вашем варианте не чистятся ни очереди, ни таблицы.

А идеи я и сам могу генерировать.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8016
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

cJSON: Метод ToGroup() и списки

Сообщение Игорь Столяров »

Дед Пахом писал(а): 10 Октябрь 2024, 19:06 хотя бы для случая вложенных массивов групп
Конечно решение должно быть общим.
Но если будет GROUP,DIM(X) с вложенным списком - Вы не сможете задать для этих списков
опцию "Insatance", т.к. имя списка будет одинаковое в каждом элементе массива. Извините. ;)
Дед Пахом писал(а): 10 Октябрь 2024, 19:06 в котором уже есть распарсенные опции, а не первый попавшийся
Методов ToGroup() стало много и разных, но под одним именем.
Я разбираюсь с ними по INС файлу, мог что-то упустить.
Возможно если бы была сводная таблица, как для OPTIONS - пользоваться ими было бы проще.
Дед Пахом писал(а): 10 Октябрь 2024, 19:06 А идеи я и сам могу генерировать.
Я не генерю идеи. Идеи - это что-то новое.
Ранее я рассказывал о вопросах, которые не мог решить существующими методами. Вы помогали.
Конкретно в данной теме я обращаю внимание на проблему с потерей указателей вложенных списков.
Причём проблема демонстрируется на штатном примере. Вот и всё и не более того ... :)
Make Clarion Great Again ! 😎
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3284
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 48 раз
Контактная информация:

cJSON: Метод ToGroup() и списки

Сообщение Дед Пахом »

Спасибо за сигнал, пример исправлю.
С уважением, ДП
Ответить