JSON, нюансы использования

Любые обсуждения, не нарушающие правил форума.

Модератор: Модераторы

JSON, нюансы использования

Сообщение *Rik* » 06.06.2024 17:59:07

Коллеги, доброго дня.

Как вам такой JSON объект? Что скажете?
Код: Выделить всё
{ "tovar" : 18, "kolvo" : 2, "tovar" : 36, "kolvo" : 2, "tovar" : 123, "kolvo" : 2, "tovar" : 162, "kolvo" : 2, "tovar" : 180, "kolvo" : 2 }

Кто нибудь может такой составить средствами fcl-json? И прочитать так-же.
И из него вытекает следующий:
Код: Выделить всё
{ "result" : [{ "tovar" : 18, "kolvo" : 2, "tovar" : 36, "kolvo" : 2, "tovar" : 123, "kolvo" : 2, "tovar" : 162, "kolvo" : 2, "tovar" : 180, "kolvo" : 2 }] }


Разработчик говорит что использовал fcl-json, даже код прислал для чтения первого примера, но он у меня не заработал. Там у него через TBaseJSONEnumerator чтение, у меня читается только первая пара tovar, kolvo далее вываливается из цикла, просто выходит без ошибок а разработчик божится что у него всё работает.
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 440
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: JSON, нюансы использования

Сообщение MaratIsk » 06.06.2024 20:51:02

разработчик не знает массивы Json и к тому же просто врун

Добавлено спустя 3 минуты 21 секунду:
{ "result" : [{ "tovar" : 18, "kolvo" : 2}, {"tovar" : 36, "kolvo" : 2}, {"tovar" : 123, "kolvo" : 2}, {"tovar" : 162, "kolvo" : 2}, {"tovar" : 180, "kolvo" : 2 }] }
MaratIsk
постоялец
 
Сообщения: 105
Зарегистрирован: 20.08.2009 18:15:20

Re: JSON, нюансы использования

Сообщение iskander » 06.06.2024 21:35:59

*Rik* писал(а):Как вам такой JSON объект? Что скажете?

Текущий стандарт по неведомой причине не запрещает явно дублирующиеся ключи в объектах, возможно у авторов имеются примеры, где подобное поведение уместно и полезно.
Тем не менее поведение парсера в такой ситуации отдаётся на откуп конкретной реализации, емнип у TJSONParser для дублирующихся ключей возможны только два варианта поведения: исключение либо игнор.
То же самое касается порядка следования пар ключ-значение в объектах, обычно считается, что он не определён, но...
А с точки зрения интероперабельности и здравого смысла вышеуказанный JSON не более, чем просто кучка хлама, поскольку невозможно стандартным способом определить какое "kolvo" к какому "tovar" относится.
iskander
энтузиаст
 
Сообщения: 597
Зарегистрирован: 08.01.2012 18:43:34

Re: JSON, нюансы использования

Сообщение *Rik* » 06.06.2024 22:24:57

Коллеги, всё так и есть, мы просили:
Код: Выделить всё
{ "result" : [{ "tovar" : 18, "kolvo" : 2}, {"tovar" : 36, "kolvo" : 2}, {"tovar" : 123, "kolvo" : 2}, {"tovar" : 162, "kolvo" : 2}, {"tovar" : 180, "kolvo" : 2 }] }

И я сделал надстройку, которая преобразовывает выдачу как раз в такой массив, с которым можно нормально работать.
К сожалению, да, стандарт не запрещает дублирование ключей, но если опция дублирования разрешена, читается последняя пара ключ-значение. Но разработчик уперся, не предоставив рабочего примера, просто заявив, что у него всё работает. Мне стало интересно, можно ли это заставить работать штатными средствами, возможно кто-то сталкивался и знает обходные "хитрости" fpc-json.
С нашей стороны, разработчику был предоставлен полностью рабочий код формирования и чтений в нужном формате (30 строк кода на чтение и столько же на формирование JSON в нужном формате, 15 минут работы на внедрение), но со стороны разработчика полный игнор. Либо полная не компетентность, либо умышленные действия, чтобы поиметь профит за переделку.

Добавлено спустя 32 минуты 7 секунд:
iskander писал(а):
*Rik* писал(а):Как вам такой JSON объект? Что скажете?

А с точки зрения интероперабельности и здравого смысла вышеуказанный JSON не более, чем просто кучка хлама, поскольку невозможно стандартным способом определить какое "kolvo" к какому "tovar" относится.

Вот я так-же написал, тот результат который мы получаем, сам по себе просто абсурден.
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 440
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: JSON, нюансы использования

Сообщение iskander » 07.06.2024 12:15:16

*Rik* писал(а):Мне стало интересно, можно ли это заставить работать штатными средствами

Имхо с использованием fcl-json никак.
iskander
энтузиаст
 
Сообщения: 597
Зарегистрирован: 08.01.2012 18:43:34

Re: JSON, нюансы использования

Сообщение grot » 07.06.2024 15:37:44

Не в силах удержаться от комментариев и вмешаться в дискуссию...

С помощью fcl-json можно записать все , что угодно и как угодно в формат JSON
и прочитать все, что угодно из формата JSON. Это просто транспорт - средство ПЕРЕНОСА данных.

Вы пытаетесь начинать что-то интерпритировать, что правильно / что неправильно - это не задача транспортного уровня !

Прочитали данные во что угодно - а дальше делайте с ними все , что пожелаете,
но уже за пределами JSON ...
grot
новенький
 
Сообщения: 77
Зарегистрирован: 13.02.2010 16:33:03

Re: JSON, нюансы использования

Сообщение *Rik* » 07.06.2024 19:23:15

grot писал(а):Не в силах удержаться от комментариев и вмешаться в дискуссию...

С помощью fcl-json можно записать все , что угодно и как угодно в формат JSON
и прочитать все, что угодно из формата JSON. Это просто транспорт - средство ПЕРЕНОСА данных.

Вы пытаетесь начинать что-то интерпритировать, что правильно / что неправильно - это не задача транспортного уровня !

Прочитали данные во что угодно - а дальше делайте с ними все , что пожелаете,
но уже за пределами JSON ...

Да, слово как угодно подразумевает удаление гланд через ...
Тогда пример будьте добры, для
Код: Выделить всё
{ "tovar" : 18, "kolvo" : 2, "tovar" : 36, "kolvo" : 2, "tovar" : 123, "kolvo" : 2, "tovar" : 162, "kolvo" : 2, "tovar" : 180, "kolvo" : 2 }

прочитать и записать средствами fcl-json. И да, JSON и XML хороши тем, что к полям объекта можно обращаться по именам. Может сможете чтение и запись организовать с помощью использования имен полей tovar и kolvo?
grot писал(а):Это просто транспорт - средство ПЕРЕНОСА данных.

Данные выглядят следующим образом:
Type tovardata = record
tovar: integer;
kolvo: integer;
end;
Данные образуют одну сущность {tovar,kolvo}, оно даже на физическом уровне разложено в по ящикам.
Для переноса данных логично сущности организовать в массив [{},{},{}], разве нет? И тот кто получает данные должен как-то это всё прочитать без танцев с бубном, если понадобится передать приложению на Go, например там бы JSON с массивом легко распарсился в массив структур, вот указанную запись то-же не читает.
И потом, скажите, какой смысл тогда в массиве вот тут? Чтобы просто он был ради себя самого?
Код: Выделить всё
{ "result" : [{ "tovar" : 18, "kolvo" : 2, "tovar" : 36, "kolvo" : 2, "tovar" : 123, "kolvo" : 2, "tovar" : 162, "kolvo" : 2, "tovar" : 180, "kolvo" : 2 }] }

Если в массиве будет всегда один элемент? Почему не вот так тогда? Какой смысл в таких извращениях? Полная некомпетентность?
Код: Выделить всё
{ "result" : { "tovar" : 18, "kolvo" : 2, "tovar" : 36, "kolvo" : 2, "tovar" : 123, "kolvo" : 2, "tovar" : 162, "kolvo" : 2, "tovar" : 180, "kolvo" : 2 } }

JSON для того и выбирают, чтобы где угодно легко работать с данными, но если использовать как угодно, тогда какой смысл в нем вообще? Если нет возможности обращаться к данным по именам полей, то можно было бы и без json все просто одной строкой через запятую 18,2,36,2,123,2,162,2. Так ведь данные на транспортном уровне ещё проще перенести, букв меньше а парсить проще чем тот самый JSON.
JSON хорош тем, что получив его, можно обращаться к полям сущности по имени, работать с массивом как с набором данных, а когда используется принцип как угодно, этот становится невозможным, в примере у сущности всего 2 поля tovar и kolvo, а представьте если там десятки полей, какой бы геморрой из этого возник? Вот бы СДЭК или Почта России организовала передачу данных о посылках в JSON по принципу Как угодно, вот это был бы цирк.
Последний раз редактировалось *Rik* 07.06.2024 20:42:16, всего редактировалось 5 раз(а).
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 440
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: JSON, нюансы использования

Сообщение MaratIsk » 07.06.2024 19:49:17

а еще товарные позиции содержат, как правило, тысячи наименований. попросите разработчика протестировать свою поделку на реальном объеме данных
MaratIsk
постоялец
 
Сообщения: 105
Зарегистрирован: 20.08.2009 18:15:20

Re: JSON, нюансы использования

Сообщение grot » 07.06.2024 22:41:22

Код: Выделить всё
{ "tovar" : 18, "kolvo" : 2, "tovar" : 36, "kolvo" : 2, "tovar" : 123, "kolvo" : 2, "tovar" : 162, "kolvo" : 2, "tovar" : 180, "kolvo" : 2 }

Это не json

Код: Выделить всё
{ "result" : [{ "tovar" : 18, "kolvo" : 2, "tovar" : 36, "kolvo" : 2, "tovar" : 123, "kolvo" : 2, "tovar" : 162, "kolvo" : 2, "tovar" : 180, "kolvo" : 2 }] }


И это тоже.

..
grot
новенький
 
Сообщения: 77
Зарегистрирован: 13.02.2010 16:33:03

Re: JSON, нюансы использования

Сообщение *Rik* » 07.06.2024 22:58:49

grot писал(а):
Код: Выделить всё
{ "tovar" : 18, "kolvo" : 2, "tovar" : 36, "kolvo" : 2, "tovar" : 123, "kolvo" : 2, "tovar" : 162, "kolvo" : 2, "tovar" : 180, "kolvo" : 2 }

Это не json

Код: Выделить всё
{ "result" : [{ "tovar" : 18, "kolvo" : 2, "tovar" : 36, "kolvo" : 2, "tovar" : 123, "kolvo" : 2, "tovar" : 162, "kolvo" : 2, "tovar" : 180, "kolvo" : 2 }] }


И это тоже.

..

Вот о том то и речь... Я уж подумал, Вы какие-то хитрости знаете не документированные...
Разработчик сует мне схемы с официального сайта с документацией json, доказывая что тут всё верно. Может оно и соответствует схемам, но вариант то не рабочий.
Технически это json, схеме оно и вправду соответствует и даже успешно проверяется некоторыми валидаторами, но отсутствие логического деления на сущности и как следствие повторение имен ключей, делает практическое использование конструкции либо невозможной либо теряется всё удобство формата.
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 440
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: JSON, нюансы использования

Сообщение iskander » 08.06.2024 08:20:41

grot писал(а):КОД: ВЫДЕЛИТЬ ВСЁ
{ "tovar" : 18, "kolvo" : 2, "tovar" : 36, "kolvo" : 2, "tovar" : 123, "kolvo" : 2, "tovar" : 162, "kolvo" : 2, "tovar" : 180, "kolvo" : 2 }

Это не json


Хм, и что же это тогда по-вашему? Данунакская народная песня? :D
iskander
энтузиаст
 
Сообщения: 597
Зарегистрирован: 08.01.2012 18:43:34

Re: JSON, нюансы использования

Сообщение *Rik* » 08.06.2024 09:16:34

iskander писал(а):
grot писал(а):КОД: ВЫДЕЛИТЬ ВСЁ
{ "tovar" : 18, "kolvo" : 2, "tovar" : 36, "kolvo" : 2, "tovar" : 123, "kolvo" : 2, "tovar" : 162, "kolvo" : 2, "tovar" : 180, "kolvo" : 2 }

Это не json


Хм, и что же это тогда по-вашему? Данунакская народная песня? :D

Технически, такая конструкция допустима, но по факту, по какому то неписанному правилу или соглашению о работе с JSON (нигде не нашел почему так), почти все парсеры это прочтут, но из повторяющихся ключей, будут прочитаны только самые последние, т.е все парсеры приведут объект к виду { "tovar" : 180, "kolvo" : 2 }, в т.ч. и парсер fcl-json работает точно так-же. И да, я припоминаю, что давным давно где то встречал использование повторяющихся ключей, по моему на каких-то сервисах центробанка, в выдаче были повторяющиеся ключи, актуальные значения просто дописывались в объект последними, соответственно все предыдущие становились не актуальными и оставались для "истории", но там люди хотя бы понимали что делают и как это будет прочитано.
Я попробовал онлайн парсеры, везде одинаково и так будет видимо во всех парсерах на всех языках, из повторяющихся ключей, читаются только последние значения.
Последний раз редактировалось *Rik* 08.06.2024 10:08:04, всего редактировалось 1 раз.
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 440
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: JSON, нюансы использования

Сообщение iskander » 08.06.2024 09:52:14

*Rik* писал(а):Я попробовал онлайн парсеры, везде одинаково и так будет видимо во всех парсерах на всех языках, из повторяющихся ключей, читаются только последние значения.

Я знаю по крайней мере одну библиотеку, которая может распарсить такой JSON и даже сохранит порядок следования элементов в объектах. Живёт вот здесь. Кстати, имеет ещё множество фич, которых нет в fcl-json.
iskander
энтузиаст
 
Сообщения: 597
Зарегистрирован: 08.01.2012 18:43:34

Re: JSON, нюансы использования

Сообщение Sergei I. Gorelkin » 08.06.2024 10:58:50

*Rik* писал(а):Технически, такая конструкция допустима, но по факту, по какому то неписанному правилу или соглашению о работе с JSON (нигде не нашел почему так), почти все парсеры это прочтут, но из повторяющихся ключей, будут прочитаны только самые последние, т.е все парсеры приведут объект к виду { "tovar" : 180, "kolvo" : 2 }, в т.ч. и парсер fcl-json работает точно так-же.


JSON - это JavaScript Object Notation, буквальное отображение структуры javascript oбъекта в виде строки. Изначально предполагалось, что javascript объекты сериализуются в строку, передаются куда-то, и потом из строки восстанавливаются исходные объекты. Отсюда и (достаточно скудный) набор сущностей, которые можно записать в json.
Так как у объектов не может быть повторяющихся имен полей, то никакой объект не позволит получить строку, которую рассматривают в данной теме. А чтение такой строки приведет к многократной перезаписи полей, которые в конце будут иметь значения, равные последнему прочитанному.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1403
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: JSON, нюансы использования

Сообщение iskander » 08.06.2024 11:56:33

Sergei I. Gorelkin писал(а):
*Rik* писал(а):Технически, такая конструкция допустима, но по факту, по какому то неписанному правилу или соглашению о работе с JSON (нигде не нашел почему так), почти все парсеры это прочтут, но из повторяющихся ключей, будут прочитаны только самые последние, т.е все парсеры приведут объект к виду { "tovar" : 180, "kolvo" : 2 }, в т.ч. и парсер fcl-json работает точно так-же.


JSON - это JavaScript Object Notation, буквальное отображение структуры javascript oбъекта в виде строки. Изначально предполагалось, что javascript объекты сериализуются в строку, передаются куда-то, и потом из строки восстанавливаются исходные объекты. Отсюда и (достаточно скудный) набор сущностей, которые можно записать в json.
Так как у объектов не может быть повторяющихся имен полей, то никакой объект не позволит получить строку, которую рассматривают в данной теме. А чтение такой строки приведет к многократной перезаписи полей, которые в конце будут иметь значения, равные последнему прочитанному.


Дискуссия начинает слегка напоминать притчу о слепых и слоне.
Сам-то JSON полагает, что он представляет собой легковесный текстовый, независимый от языка программирования формат обмена данными.
iskander
энтузиаст
 
Сообщения: 597
Зарегистрирован: 08.01.2012 18:43:34

След.

Вернуться в Потрепаться

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru
cron