cJSON: Формат полей для вложенных структур

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

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

cJSON: Формат полей для вложенных структур

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

Спасибо за ответ.

1. Если честно - то я не умею пользоваться DebugLog, наверно это только в C11 ?
Не надо Message() ! Если заданы, но не корректы Options - верните результат False, мы сами разберёмся с проблемой.
Иначе получатся, что метод выполняется в непредсказуемой форме, но с положительным результатом ! :shock:

3. Логично, но ситуация развивается несколько иначе ... ;)
В отсутствие п.4., New() выполняет вспомогательная процедура из класса json::LoadFile(), а список адресов
выделенной памяти ведёт (и выполняет их Dispose()) - уже прикладная программа ...
И да, я знаю, что этот вопрос можно решить через субклассинг. :)

4. Уже за это - спасибо. :)
Сейчас загрузку файлов вообще делаем вручную, а выгрузку костылим через IsStringRef: :(

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

! Загрузить из файла строку в BASE64
Class.IsLoadFile Procedure(String xFilename) !, *String
xContent    &String
xBuffer     &IDynStr
  Code
  xContent &= json::LoadFile(xFilename)
  If Not (xContent &= Null)
     xBuffer &= NewDynStr()
     If Not (xBuffer &= Null) then xBuffer.Cat(ToBase64(xContent))  ! Содержимое файла в BASE64
        Dispose(xContent)  ! Пересоздать строку
        xContent &= New(String(xBuffer.StrLen()))
        xBuffer.CopyTo(xContent)
        xBuffer.Kill; DisposeDynStr(xBuffer)
     end
  end
  Return xContent
Последний раз редактировалось Игорь Столяров 04 Декабрь 2022, 20:23, всего редактировалось 1 раз.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

cJSON: Формат полей для вложенных структур

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

Под DebugLog я имею в виду результат работы api функции OutputDebugString, который (результат) можно посмотреть утилитой DebugView (SysInternals). На сайте SysInternals много чего интересного есть.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

cJSON: Формат полей для вложенных структур

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

Добрый день !

Подскажите пожалуйста, я правильно понимаю, что эти выражения вернут абсолютно одно и то же ?
(содержание JSON строки в кодировке UTF8)

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

  Root &= json::CreateString(...)
  If Not (Root &= Null)
     Message( json::ToUtf8(Root.ToString()) )  ! 1 вариант
     Message( Root.ToUtf8() )  ! 2 вариант
     Root.Delete() 
  end   
:ty:
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

cJSON: Формат полей для вложенных структур

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

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

cJSON: Формат полей для вложенных структур

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

Спасибо. Это понятно - вопросы с экранированием и кодировкой RAW строк должны решаться отдельно.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

cJSON: Формат полей для вложенных структур

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

Не нравятся классу пустые группы, причём даже без "Ignore". :(

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

Class.MyTest  Procedure()
gPack  Group
Title     Group
CreateDate   String(10)
CreateTime   String( 8)
Counters     Group
             end
          end
       end
 Code
 Root &= json::CreateObject(gPack)
 Message(Root.ToUTF8())
 Root.Delete()
Результат с дублированием наименования группы:

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

{
  "title": {
    "createdate": "",
    "createtime": "",
    "counters": {}
  },
  "counters": {}
}
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

cJSON: Формат полей для вложенных структур

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

Наверно вопрос из той же серии, что и предыдущий. Но уже без пустых групп.
Если позволите - я опубликую пример для тестирования:

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

Class.MyTest  Procedure()
Root   &cJson

gPack  Group
Title     Group
CreateDate   String(10)
CreateTime   String( 8)
TimeStamp    String(25)
PackID       String(36)
DateStart    String(10)
DateEnd      String(10)
Terminal     Long
Action       Byte
ExportGraph  Bool
Remark       CString(251)
Enterprise   CString(251)
Otdel        CString(251)
Operator     CString(251)

Counters     Group
CountShet       Long
CountKass       Long
CountBank       Long
CountTrNakl     Long
CountHistory    Long
CountFall       Long
CountPlat       Long
CountClient     Long
CountTovar      Long
             end
          end

Documents Group
Doc1        &Queue
Doc2        &Queue
Doc3        &Queue
Doc4        &Queue
Doc5        &Queue
Doc6        &Queue
Doc7        &Queue
Doc8        &Queue
Doc9        &Queue
          end
      end

qD1   Queue.
qD2   Queue.
qD3   Queue.
qD4   Queue.
qD5   Queue.
qD6   Queue.
qD7   Queue.
qD8   Queue.
qD9   Queue.

  Code
  Root &= json::CreateObject(gPack,,'[' & |
                                     '{{"name":"Doc1","instance":' & Instance(qD1, Thread()) & '},' & |
                                     '{{"name":"Doc2","instance":' & Instance(qD2, Thread()) & '},' & |
                                     '{{"name":"Doc3","instance":' & Instance(qD3, Thread()) & '},' & |
                                     '{{"name":"Doc4","instance":' & Instance(qD4, Thread()) & '},' & |
                                     '{{"name":"Doc5","instance":' & Instance(qD5, Thread()) & '},' & |
                                     '{{"name":"Doc6","instance":' & Instance(qD6, Thread()) & '},' & |
                                     '{{"name":"Doc7","instance":' & Instance(qD7, Thread()) & '},' & |
                                     '{{"name":"Doc8","instance":' & Instance(qD8, Thread()) & '},' & |
                                     '{{"name":"Doc9","instance":' & Instance(qD9, Thread()) & '}]')
  If Not (Root &= Null)
     json::SaveFile('Test.json',Root.ToUtf8())
     Root.Delete()
  end
Результат:

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

{
  "title": {
    "createdate": "",
    "createtime": "",
    "timestamp": "",
    "packid": "",
    "datestart": "",
    "dateend": "",
    "terminal": 0,
    "action": 0,
    "exportgraph": 0,
    "remark": "",
    "enterprise": "",
    "otdel": "",
    "operator": "",
    "counters": {
      "countshet": 0,
      "countkass": 0,
      "countbank": 0,
      "counttrnakl": 0,
      "counthistory": 0,
      "countfall": 0,
      "countplat": 0,
      "countclient": 0,
      "counttovar": 0
    }
  },
  "doc8": [],
  "doc9": []
}
Вопрос: А где Doc1 ... Doc7 и чем они собственно отличаются от Doc8 ... Doc9 ? Где группа Documents ?
Спасибо за проверку. :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

cJSON: Формат полей для вложенных структур

Сообщение Admin »

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

cJSON: Формат полей для вложенных структур

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

Admin писал(а): 06 Декабрь 2022, 9:18Сломали класс
Не согласный я с этим ! :nono: Элементарные "группка + списочек" везде работают.
Но не все пошли дальше. А те кто пойдут - сразу увидят тоже самое, что и я.

Сами структуры JSON - очень красивые в своей идее (где блин комментарии только ?).
Класс - великолепный, огромное спасибо, что у нас есть возможность работы с JSON
(крупным производителям библиотек кучка кларионистов давно не интересна).

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

cJSON: Формат полей для вложенных структур

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

Игорь Столяров писал(а): 05 Декабрь 2022, 23:25 Не нравятся классу пустые группы, причём даже без "Ignore".
Дошли руки пока только до этого, вроде починил.
Заходит однажды тестировщик в бар.
Забегает в бар.
Пролезает в бар.
Танцуя, проникает в бар.
Крадется в бар.
Врывается в бар.
Прыгает в бар

и заказывает:

кружку пива,
2 кружки пива,
0 кружек пива,
999999999 кружек пива,
ящерицу в стакане,
–1 кружку пива,
qwertyuip кружек пива.
Вложения
cjson.clw
(79.46 КБ) 19 скачиваний
С уважением, ДП
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

cJSON: Формат полей для вложенных структур

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

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

cJSON: Формат полей для вложенных структур

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

Выдайте пжалуйста тестировщку ещё INC файл для комплекта ! :)

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

cJSON: Формат полей для вложенных структур

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

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

cJSON: Формат полей для вложенных структур

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

С вложенными группами такой геморрой. Проверяйте.

Тем временем я сделал поиск по json (JSON Path). Примеры:

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

resCount = jRoot.FindPathContext('$ [ "store" ][ * ][ "price" ]', output)  ! все цены в магазине
resCount = jRoot.FindPathContext('$ [ "store" ]["book"][2:3][ "price" ]', output)  ! цены на 2-ю и 3-ю книги
resCount = jRoot.FindPathContext('$ [ "store" ]["book"][(@.length)][ "price" ]', output)  ! цена на последнюю в списке книгу
resCount = jRoot.FindPathContext('$ [ "store" ]["book"][?(@.price << 10)]', output)  ! все книги дешевле 10 копеек
resCount = jRoot.FindPathContext('$["store"]["book"][1,4]["price"]', output)  ! цены на 1-ю и 4-ю книги
resCount = jRoot.FindPathContext('$[..][category,isbn]', output)  !- все категории и все номера isbn
resCount = jRoot.FindPathContext('$[store][book][?(instring("Tolkien",@.author,1,1)>0)]', output)    !- все книги Толкина
resCount = jRoot.FindPathContext('$[store][book][?(instring("Tolkien",@.author,1,1)>0)][price]', output)    !- все цены на книги Толкина
Сам JSON:

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

  jRoot &= jParser.Parse(  '' |
    & '{{ "store": {{'                              |
    & '    "book": [ '                              |
    & '      {{ "category": "reference",'           |
    & '        "author": "Nigel Rees",'             |
    & '        "title": "Sayings of the Century",'  |
    & '        "price": 8.95'                       |
    & '      },'                                    |
    & '      {{ "category": "fiction",'             |
    & '        "author": "Evelyn Waugh",'           |
    & '        "title": "Sword of Honour",'         |
    & '        "price": 12.99'                      |
    & '      },'                                    |
    & '      {{ "category": "fiction",'             |
    & '        "author": "Herman Melville",'        |
    & '        "title": "Moby Dick",'               |
    & '        "isbn": "0-553-21311-3",'            |
    & '        "price": 8.99'                       |
    & '      },'                                    |
    & '      {{ "category": "fiction",'             |
    & '        "author": "J. R. R. Tolkien",'       |
    & '        "title": "The Lord of the Rings",'   |
    & '        "isbn": "0-395-19395-8",'            |
    & '        "price": 22.99'                      |
    & '      }'                                     |
    & '    ],'                                      |
    & '    "bicycle": {{'                           |
    & '      "color": "red",'                       |
    & '      "price": 19.95'                        |
    & '    }'                                       |
    & '  }'                                         |
    & '}'                                           |
  )
Но это когда Игорь скажет, что новая версия работает.
Вложения
cjson.clw
(80.07 КБ) 19 скачиваний
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

cJSON: Формат полей для вложенных структур

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

Дед Пахом писал(а): 07 Декабрь 2022, 0:36 С вложенными группами такой геморрой.
Так обмен информационных систем через пакеты структурированных данных - это и есть JSON ! :)
Все мои тесты работают. Убрал многочисленные костыли в реальном коде - теперь красота страшная ! :ty:

Раньше пакет формировался как текстовый файл со структурой JSON в &IDynStr - экранов 40 кода.
Теперь задали структуру, заполнили и выгрузили одной командой (опции на экран). Это даже детям понятно.
Сегодня переходим к экспорту списков содержащих список внутри списка ... Интересно аж жуть ! ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Закрыто