cJSON: Как отжать массив в массиве ?

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

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

cJSON: Как отжать массив в массиве ?

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

Привет всем !

Помогите пожалуйста кто чем может начинающему парсеру JSON !
Видимо у меня пока хромает сама идеология работы с классом. :(
Честно - не понимаю как решить сабж ! Примеры смотрел, вроде не совсем тупой ...

Пошёл методом тыка. Пример - получить список сотрудников с телефонами.

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

StrJSON  CString('{{'                                     & |
                   '"Workers": ['                         & |
                     '{{"Name": "Igor",'                  & |
                       '"Contacts": {{'                   & |
                         '"Contact": ['                   & |
                           '{{"Phone": "+79031112233"},'  & |
                           '{{"Phone": "+79034445566"}'   & |
                         ']}'                             & |
                     '},'                                 & |
                     '{{"Name": "Oleg",'                  & |
                       '"Contacts": {{'                   & |
                         '"Contact": ['                   & |
                           '{{"Phone": "+79098887766"},'  & |
                           '{{"Phone": "+79048881234"},'  & |
                           '{{"Phone": "+79095554433"}'   & |
                         ']}'                             & |
                     '}'                                  & |
                   ']'                                    & |
                 '}')

json      cJSONFactory
root      &cJson
jWorkers  &cJson
jContact  &cJson

T_Contact Queue,Type
Phone       CString(21)
          end

QWorks    Queue
Name        CString(21)
Contacts    &T_Contact
          end
  Code
  QWorks.Contacts &= New T_Contact

  root &= json.Parse(StrJSON)
  If Not Root &= Null
     jWorkers &= root.FindObjectItem('Workers')
     If Not jWorkers &= Null
        If jWorkers.IsArray()
           jWorkers.ToQueue(QWorks)
           Message('Records(QWorks) = ' & Records(QWorks))  ! 2 СОТРУДНИКА - ВСЁ ПРАВИЛЬНО :)

           ! А ДАЛЬШЕ ?

          !jContact &= root.FindObjectItem('Contact')
           jContact &= jWorkers.FindObjectItem('Contact')
           If Not jContact &= Null
              If jContact.IsArray()
                 jContact.ToQueue(QWorks.Contacts)  ! < --- И ВОТ ЗДЕСЬ НАСТИГ GPF :(
                 Message('Records(QWorks.Contacts) = ' & Records(QWorks.Contacts))
              end
           end
           
        end
     end

     Root.Delete()
  end

  If Not (QWorks.Contacts &= Null)
     Free(QWorks.Contacts)
     Dispose(QWorks.Contacts)
  end
И мне непонятно - как разделить телефоны по сотрудникам ... в общем печаль. :(
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

cJSON: Как отжать массив в массиве ?

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

Я конечно немного начудил с указателями в QUEUE ... Всё заработало.
Остался крайний вопрос: как в cJSON переключаться между блоками массивов ?

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

  root &= json.Parse(StrJSON)
  If Not Root &= Null
     jWorkers &= root.FindObjectItem('Workers')
     If Not jWorkers &= Null
        If jWorkers.IsArray()
           jWorkers.ToQueue(QWorks)
           Message('Records(QWorks) = ' & Records(QWorks))  ! 2 сотрудника, OK !

           Loop Index# = 1 to Records(QWorks)
             Get(QWorks,Index#)

             QWorks.Contacts &= New T_Contact

             jContact &= jWorkers.FindObjectItem('Contact')
             If Not jContact &= Null
                If jContact.IsArray()
                   jContact.ToQueue(QWorks.Contacts)
                   
                   ! ЗДЕСЬ ВСЕГДА ПОЛУЧАЮ ТЕЛЕФОНЫ ПЕРВОГО СОТРУДНИКА ... :(
                   ! НУЖНО КАК-ТО ПЕРЕКЛЮЧАТЬСЯ НА БЛОК ВТОРОГО СОТРУДНИКА ...
                   Message('Records(QWorks.Contacts) = ' & Records(QWorks.Contacts))
                end
             end

             If Not (QWorks.Contacts &= Null) then Free(QWorks.Contacts); Dispose(QWorks.Contacts).
           end
        end
     end

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

cJSON: Как отжать массив в массиве ?

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

Как-то так

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

jWorker &= jWorkers.GetArrayItem(w)
jContact &= jWorker.FindObjectItem('Contact')
С уважением, ДП
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

cJSON: Как отжать массив в массиве ?

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

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

cJSON: Как отжать массив в массиве ?

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

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

cJSON: Как отжать массив в массиве ?

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

Дед Пахом писал(а): 07 Ноябрь 2022, 12:01 Вообще так себе идея всё пихать в одну очередь
Это всего лишь тестовая задача для понимания логики парсинга.
В реале конечно же будут мухи отдельно, котлеты отдельно ... ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Ответить