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

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

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

Аватара пользователя
*Rik*
постоялец
Сообщения: 453
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал
Контактная информация:

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

Сообщение *Rik* »

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

Как вам такой 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 далее вываливается из цикла, просто выходит без ошибок а разработчик божится что у него всё работает.
MaratIsk
постоялец
Сообщения: 125
Зарегистрирован: 20.08.2009 18:15:20

Сообщение MaratIsk »

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

Добавлено спустя 3 минуты 21 секунду:
{ "result" : [{ "tovar" : 18, "kolvo" : 2}, {"tovar" : 36, "kolvo" : 2}, {"tovar" : 123, "kolvo" : 2}, {"tovar" : 162, "kolvo" : 2}, {"tovar" : 180, "kolvo" : 2 }] }
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

*Rik* писал(а):Как вам такой JSON объект? Что скажете?
Текущий стандарт по неведомой причине не запрещает явно дублирующиеся ключи в объектах, возможно у авторов имеются примеры, где подобное поведение уместно и полезно.
Тем не менее поведение парсера в такой ситуации отдаётся на откуп конкретной реализации, емнип у TJSONParser для дублирующихся ключей возможны только два варианта поведения: исключение либо игнор.
То же самое касается порядка следования пар ключ-значение в объектах, обычно считается, что он не определён, но...
А с точки зрения интероперабельности и здравого смысла вышеуказанный JSON не более, чем просто кучка хлама, поскольку невозможно стандартным способом определить какое "kolvo" к какому "tovar" относится.
Аватара пользователя
*Rik*
постоялец
Сообщения: 453
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал
Контактная информация:

Сообщение *Rik* »

Коллеги, всё так и есть, мы просили:

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

{ "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" относится.
Вот я так-же написал, тот результат который мы получаем, сам по себе просто абсурден.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

*Rik* писал(а):Мне стало интересно, можно ли это заставить работать штатными средствами
Имхо с использованием fcl-json никак.
grot
новенький
Сообщения: 82
Зарегистрирован: 13.02.2010 15:33:03

Сообщение grot »

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

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

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

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

Сообщение *Rik* »

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 19:42:16, всего редактировалось 5 раз.
MaratIsk
постоялец
Сообщения: 125
Зарегистрирован: 20.08.2009 18:15:20

Сообщение MaratIsk »

а еще товарные позиции содержат, как правило, тысячи наименований. попросите разработчика протестировать свою поделку на реальном объеме данных
grot
новенький
Сообщения: 82
Зарегистрирован: 13.02.2010 15:33:03

Сообщение 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 }] }
И это тоже.

..
Аватара пользователя
*Rik*
постоялец
Сообщения: 453
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал
Контактная информация:

Сообщение *Rik* »

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, схеме оно и вправду соответствует и даже успешно проверяется некоторыми валидаторами, но отсутствие логического деления на сущности и как следствие повторение имен ключей, делает практическое использование конструкции либо невозможной либо теряется всё удобство формата.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43: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
Аватара пользователя
*Rik*
постоялец
Сообщения: 453
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал
Контактная информация:

Сообщение *Rik* »

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 09:08:04, всего редактировалось 1 раз.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

*Rik* писал(а):Я попробовал онлайн парсеры, везде одинаково и так будет видимо во всех парсерах на всех языках, из повторяющихся ключей, читаются только последние значения.
Я знаю по крайней мере одну библиотеку, которая может распарсить такой JSON и даже сохранит порядок следования элементов в объектах. Живёт вот здесь. Кстати, имеет ещё множество фич, которых нет в fcl-json.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

*Rik* писал(а):Технически, такая конструкция допустима, но по факту, по какому то неписанному правилу или соглашению о работе с JSON (нигде не нашел почему так), почти все парсеры это прочтут, но из повторяющихся ключей, будут прочитаны только самые последние, т.е все парсеры приведут объект к виду { "tovar" : 180, "kolvo" : 2 }, в т.ч. и парсер fcl-json работает точно так-же.
JSON - это JavaScript Object Notation, буквальное отображение структуры javascript oбъекта в виде строки. Изначально предполагалось, что javascript объекты сериализуются в строку, передаются куда-то, и потом из строки восстанавливаются исходные объекты. Отсюда и (достаточно скудный) набор сущностей, которые можно записать в json.
Так как у объектов не может быть повторяющихся имен полей, то никакой объект не позволит получить строку, которую рассматривают в данной теме. А чтение такой строки приведет к многократной перезаписи полей, которые в конце будут иметь значения, равные последнему прочитанному.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

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