cJson - POST наполнение данными

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

cJson - POST наполнение данными

Сообщение gopstop2007 »

Помогите, не могу разобраться.
Нужно наполнить данными Json. Добавил Loop с данными "goods" в json зависает в цикле.

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

    DO load_goods
    DO load_payments       
        
    gd &= json::CreateObject()
    gd.AddItemToObject('code', json::CreateString('string'))    
    gd.AddItemToObject('name', json::CreateString('string'))    
    gd.AddItemToObject('barcode', json::CreateString('string'))    
    gd.AddItemToObject('excise_barcode', json::CreateString('string'))    
    gd.AddItemToObject('excise_barcodes', json::CreateString('string'))    
    gd.AddItemToObject('header', json::CreateString('string'))    
    gd.AddItemToObject('footer', json::CreateString('string'))    
    gd.AddItemToObject('price', json::CreateString('string'))    
    gd.AddItemToObject('tax', json::CreateArray(taxQ))
        
    gds &= json::CreateObject()
    Loop i# = 1 TO RECORDS(goods)       ! ===============================
        GET(goods,i#)
        gds.AddItemToObject('good', gd)    
        gds.AddItemToObject('good_id', json::CreateString(goods.good_id))    
        gds.AddItemToObject('quantity', json::CreateNumber(goods.quantity))    
        gds.AddItemToObject('is_return', json::CreateFalse())    
        gds.AddItemToObject('discounts', json::CreateArray(discounts))

!        MESSAGE('1: '& gds.ToString(TRUE))
    END	! ===================================

    !create root object
    root &= json::CreateObject()
    !add a string to root
    root.AddItemToObject('id', json::CreateString('497f6eca-6276-4993-bfeb-53cbbbba6f08'))
    root.AddItemToObject('cashier_name', json::CreateString('string'))
    root.AddItemToObject('departament', json::CreateString('string'))
    root.AddItemToObject('goods', json::CreateArrayReference(gds))
    root.AddItemToObject('delivery', json::CreateObject(delivery))
    root.AddItemToObject('discounts', json::CreateArray(discounts))
    root.AddItemToObject('payments', json::CreateArray(payments))
    root.AddItemToObject('rounding', json::CreateFalse())
    root.AddItemToObject('header', json::CreateString('string'))
    root.AddItemToObject('footer', json::CreateString('string'))
    root.AddItemToObject('barcode', json::CreateString('string'))
    root.AddItemToObject('order_id', json::CreateString('93101167-9065-4b9c-b98b-5d789a3ed9fe'))
    root.AddItemToObject('related_receipt_id', json::CreateString('d903f598-5263-4705-9a2a-fe57ee4b2b3a'))
    root.AddItemToObject('previous_receipt_id', json::CreateString('6baa5594-09b6-4656-b083-9032975dfaa0'))
    root.AddItemToObject('technical_return', json::CreateFalse())
    root.AddItemToObject('context', json::CreateObject(context))
    root.AddItemToObject('is_pawnshop', json::CreateFalse())
Спасибо за внимание
Вложения
examples.zip
Пример для проверки
(5.66 КБ) 173 скачивания
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

cJson - POST наполнение данными

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

Вроде бы вот так должно быть.

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

gditem      &cJSON  !goods item

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

    gds &= json::CreateArray()    !- gds is an array
    Loop i# = 1 TO RECORDS(goods)       ! 
      GET(goods,i#)

      !- create an array item
      gditem &= json::CreateObject()

      !- add it to the array gds
      gds.AddItemToArray(gditem)

      !- add objects to the item
      gditem.AddItemToObject('good', gd)    
      gditem.AddItemToObject('good_id', json::CreateString(goods.good_id))    
      gditem.AddItemToObject('quantity', json::CreateNumber(goods.quantity))    
      gditem.AddItemToObject('is_return', json::CreateFalse())    
      gditem.AddItemToObject('discounts', json::CreateArray(discounts))
    END
С уважением, ДП
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

cJson - POST наполнение данными

Сообщение gopstop2007 »

Дед Пахом писал(а): 04 Февраль 2022, 16:51 Вроде бы вот так должно быть.

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

gditem      &cJSON  !goods item
...
Дед спасибо тебе большое, уже выходит из цикла. :)
Только дублицирует вот этот кусок

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

      gditem.AddItemToObject('good_id', json::CreateString(goods.good_id))    
      gditem.AddItemToObject('quantity', json::CreateNumber(goods.quantity))    
      gditem.AddItemToObject('is_return', json::CreateFalse())    
      gditem.AddItemToObject('discounts', json::CreateArray(discounts))
Результат не правильный:

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

			"good":	{
				"code":	"123",
				"name":	"Рубашка",
				"barcode":	"",
				"excise_barcode":	"",
				"excise_barcodes":	[],
				"header":	"",
				"footer":	"",
				"price":	"200",
				"tax":	[],
				"uktzed":	""
			},
			"good_id":	"123",		! ==========  должно быть, один для одного Array =============
			"quantity":	1,		!
			"is_return":	false,	!
			"discounts":	[],		! конец
			"good_id":	"245",		! ========== второй повтор, повторы от количества Array =============
			"quantity":	10,		!
			"is_return":	false,	!
			"discounts":	[]		! конец

Должно быть так

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

			"good":	{
				"code":	"123",
				"name":	"Рубашка",
				"barcode":	"",
				"excise_barcode":	"",
				"excise_barcodes":	[],
				"header":	"",
				"footer":	"",
				"price":	"200",
				"tax":	[],
				"uktzed":	""
			},
			"good_id":	"123",
			"quantity":	1,
			"is_return":	false,
			"discounts":	[]
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

cJson - POST наполнение данными

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

Похоже, дублирование идёт из-за того, что Вы один и тот же объект gd добавляете во все элементы массива gds. Я бы посоветовал формирование gd вставить в тот же цикл. Или использовать gditem.AddItemReferenceToObject('good', gd), но тогда надо заботиться об ручной очистке gd, так как он передаётся как reference и не будет автоматом удалён при вызове root.Delete().
С уважением, ДП
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

cJson - POST наполнение данными

Сообщение gopstop2007 »

Вы правы, еще раз спасибо.
Рабочий вариант в аттаче, можете добавить в Ваши примеры, может еще кому то понадобится.
Вложения
examples.zip
(5.45 КБ) 155 скачиваний
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

cJson - POST наполнение данными

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

Я бы ещё упростил такие конструкции:

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

    
    !- root.AddItemToObject('header', json::CreateString('string')) можно проще
    root.AddStringToObject('header', 'string')
С уважением, ДП
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

cJson - POST наполнение данными

Сообщение gopstop2007 »

Спасибо, учту :) Видел, но не подозревал о таком замещении.
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
harry
Бывалый
Сообщения: 69
Зарегистрирован: 24 Февраль 2015, 14:16
Поблагодарили: 3 раза

cJson - POST наполнение данными

Сообщение harry »

Добрый день!
Возможно ли получить JSON из группы, если поле в группе объявлено, как ссылка на строку ?
В поле группы предполагается текст загруженный из файла поэтому заранее размер поля определить невозможно.

Например, такой вариант не проходит

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

TestGroup                       GROUP
SomeFileData                        &string
                                end
  CODE
  TestGroup.SomeFileData &= New(string(len('Some File Data')))
  TestGroup.SomeFileData = 'Some File Data'
  root &= json::CreateObject(TestGroup)
  MESSAGE(root.ToString(TRUE))
Или в этом случае такое сразу структуру (группу) в JSON перевести невозможно и надо ее разбивать на элементы и далее

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

  root.AddItemToObject('name', json::CreateString(TestGroup.SomeFileData))
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

cJson - POST наполнение данными

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

Теперь можно, но непрозрачно. Добавил правило IsStringRef:

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

TestGroup                       GROUP
SomeFileData                      &STRING
                                END
  CODE
  TestGroup.SomeFileData &= NEW(STRING(LEN('Some File Data')))
  TestGroup.SomeFileData = 'Some File Data'
  root &= json::CreateObject(TestGroup, , '{{"name":"SomeFileData", "IsStringRef":true}')
Выложил v1.20.
С уважением, ДП
harry
Бывалый
Сообщения: 69
Зарегистрирован: 24 Февраль 2015, 14:16
Поблагодарили: 3 раза

cJson - POST наполнение данными

Сообщение harry »

Спасибо! Попробую
harry
Бывалый
Сообщения: 69
Зарегистрирован: 24 Февраль 2015, 14:16
Поблагодарили: 3 раза

cJson - POST наполнение данными

Сообщение harry »

Еще раз спасибо! Все отлично работает!
Теперь вопрос, как распарсить JSON в TestGroup и получить значение в TestGroup.SomeFileData? :)
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

cJson - POST наполнение данными

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

Обратно в &STRING не получится.
С уважением, ДП
harry
Бывалый
Сообщения: 69
Зарегистрирован: 24 Февраль 2015, 14:16
Поблагодарили: 3 раза

cJson - POST наполнение данными

Сообщение harry »

Как быть в таких случаях, когда размер строкового элемента JSON заранее неизвестен? Максимальный размер может быть значительным и явно объявить String не получится.
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

cJson - POST наполнение данными

Сообщение Admin »

Вручную перебрать и все. Сам на днях буду сложный пакет разбирать.
Это так... на коленке ваял.

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

  PROGRAM                      
  
  include('cjson.inc')

  MAP
  END


JsonTreeWindow WINDOW('JsonTree'),AT(,,326,230),GRAY,MAX,FONT('Segoe UI',9),RESIZE
    LIST,AT(0,0,,),FULL,USE(?JsonTree),FORMAT('100L(2)|_FMJT~Name~@s50@100L(2' & |
        ')|_MJ~Type~@s50@#5#200L(2)_J~Value~@s255@#6#')
  END
                                   
JsonTreeQueue                 QUEUE,TYPE
ItemName                        CSTRING(200) 
ItemNameIcon                    SHORT
ItemNameLevel                   SHORT
ItemNameLoaded                  SHORT
ItemType                        CSTRING(50)
ItemShortValue                  CSTRING(100)
                              END

JsonTreeClass                 CLASS,TYPE
TreeQueue                       &JsonTreeQueue                   
Construct                       PROCEDURE
Destruct                        PROCEDURE
Run                             PROCEDURE(STRING JsonText)
Run                             PROCEDURE(*cJSON a, LONG Level=1)
                              END                                 
                              
loc:data                      STRING(4096)
JT                            JsonTreeClass
  
  CODE
  loc:data = '{{'                                             |
  & '  "data": ['                                             |  ! [ = array
  & '    {{'                                                  |  ! { = object
  & '      "id": 107,'                                        |
  & '      "name": "Khabarovsk",'                             |
  & '      "companies": ['                                    |
  & '        1,'                                              |
  & '        2,'                                              |
  & '        3,'                                              |
  & '        33,'                                             |
  & '        40,'                                             |
  & '        67,'                                             |
  & '        529'                                             |
  & '      ]'                                                 |
  & '    },'                                                  |
  & '    {{'                                                  |
  & '      "id": 108,'                                        |
  & '      "name": "Moskva",'                                 |
  & '      "companies": ['                                    |
  & '        1,'                                              |
  & '        2,'                                              |
  & '        3,'                                              |
  & '        33,'                                             |
  & '        40,'                                             |
  & '        67,'                                             |
  & '        529'                                             |
  & '      ]'                                                 |
  & '    }'                                                   |
  & '  ],'                                                    |
  & '  "error": null,'                                        |
  & '  "requestId": "2b0709e5-ecc4-43a2-8b57-ceff37239a25",'  |
  & '  "status": 200'                                         |
  & '}'                  

  JT.Run(loc:data)
  
JsonTreeClass.Construct                       PROCEDURE
  CODE
  SELF.TreeQueue &= NEW JsonTreeQueue                   
  
JsonTreeClass.Destruct                        PROCEDURE
  CODE
  FREE(SELF.TreeQueue)
  DISPOSE(SELF.TreeQueue)

JsonTreeClass.Run                             PROCEDURE(STRING JsonText)
root                                          &cJson
json                                          cJSONFactory
  CODE             
  root &= json.Parse(JsonText)
  SELF.Run(root) 
  
JsonTreeClass.Run                             PROCEDURE(*cJSON a, LONG Level=1)
item                                          &cJSON
child                                         &cJSON
  CODE
  item &= a
  LOOP
    IF item &= NULL
      BREAK
    ELSE  
      CLEAR(SELF.TreeQueue)
      SELF.TreeQueue.ItemNameIcon  = CREATE:Window
      SELF.TreeQueue.ItemNameLevel = Level
      CASE item.GetType()
      OF cJSON_Invalid
        SELF.TreeQueue.ItemType ='Invalid'
      OF cJSON_False
        SELF.TreeQueue.ItemType ='False'
      OF cJSON_True 
        SELF.TreeQueue.ItemType ='True'
      OF cJSON_NULL 
        SELF.TreeQueue.ItemType ='NULL'
      OF cJSON_Number 
        SELF.TreeQueue.ItemType ='Number'
      OF cJSON_String 
        SELF.TreeQueue.ItemType ='String'
      OF cJSON_Array  
        SELF.TreeQueue.ItemType ='Array'
      OF cJSON_Object 
        SELF.TreeQueue.ItemType ='Object'
      OF cJSON_Raw  
        SELF.TreeQueue.ItemType ='Raw'
      OF cJSON_IsReference  
        SELF.TreeQueue.ItemType ='IsReference'
      OF cJSON_StringIsConst  
        SELF.TreeQueue.ItemType ='StringIsConst'
      OF cJSON_StringIsNotConst 
        SELF.TreeQueue.ItemType ='StringIsNotConst'
      END
      SELF.TreeQueue.ItemName = item.GetName()
      CASE item.GetType()
      OF cJSON_Number                                        
        SELF.TreeQueue.ItemShortValue = item.GetNumberValue()
      OF cJSON_String 
        SELF.TreeQueue.ItemShortValue = item.GetStringValue()
      END
      ADD(SELF.TreeQueue)
      child &= item.GetChild()
      IF NOT child &= NULL  
        IF child.GetType() = cJSON_Object
          SELF.Run(item.GetChild(), Level)
        ELSE
          SELF.Run(item.GetChild(), Level+1)
        END  
      END
    END
    item &= item.GetNext()
  END
  IF Level = 1
    !XML:DebugMyQueue(SELF.TreeQueue, 'JSON Tree')
    OPEN(JsonTreeWindow)
    ?JsonTree{PROP:From} = SELF.TreeQueue
    ACCEPT
    END
    CLOSE(JsonTreeWindow)
  END
  
Вложения
2022-08-29_19-41-04.png
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Ответить