Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4 5   вперед  Ctrl      все
 Re: Посоветуйте лучшую по Вашему мнению библиотеку для работы с json  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10857
Arioch
но в офиц-доке так писать не хотят....
http://docwiki.embarcadero.com/RADStudio/Rio/en/JSON_Objects_Framework
Наверняка дока не менялась с момента появления
14 мар 19, 19:11    [21832967]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте лучшую по Вашему мнению библиотеку для работы с json  [new]
Arioch
Member

Откуда:
Сообщений: 10807
_Vasilisk_
Arioch
а если я забуду добавить явноe клонировaние ?
Будет двойной Free


Прэлэмтно! Прэлэстно!

В общем, я для себе давно вывел правило.
Если какая-то проблема решается в Delphi библиотекой "из коробки" и сторонней библиотекой - надёжнее использовать стороннюю. Особенно если она бесплатная и с исходниками

Конечно, оно не абсолютное, но для первого приближения, пока не доказано обратное, она верна
14 мар 19, 19:51    [21832987]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте лучшую по Вашему мнению библиотеку для работы с json  [new]
Arioch
Member

Откуда:
Сообщений: 10807
_Vasilisk_,

а если вот так - 21832378 ?
14 мар 19, 19:52    [21832988]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте лучшую по Вашему мнению библиотеку для работы с json  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10857
Arioch
а если вот так - 21832378 ?
Аналогично. Если один JSON объект передать во внутрь второго, то второй становится владельцем первого и сам его уничтожает.

И да, в TJSONValue нет default свойства. Так, что вместо
Arioch
LJSONValue := LJSONObject['city[1].street[''Ленина''].house[20]'];
нужно писать
LJSONValue := LJSONObject.P['city[1].street[''Ленина''].house[20]'];
Это для Rio
14 мар 19, 20:18    [21833017]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте лучшую по Вашему мнению библиотеку для работы с json  [new]
Arioch
Member

Откуда:
Сообщений: 10807
_Vasilisk_,

там не на это упор

там суть в том, что оба JSON Document я уже отдестроил, а вот после этого начинаю читать Value поддерева документа (которая была сохранена в отдельную переменную TObject)
14 мар 19, 20:28    [21833025]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте лучшую по Вашему мнению библиотеку для работы с json  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10857
Arioch
там суть в том, что оба JSON Document я уже отдестроил, а вот после этого начинаю читать Value поддерева документа (которая была сохранена в отдельную переменную TObject)
Аналогично. Родитель уничтожает за собой всех детей.

Должно быть
LJSONObject1 := TJSONObject.ParseJSONValue('c:\file1.json');
LJSONObject2 := TJSONObject.ParseJSONValue('c:\file2.json');

LJSONValue := LJSONObject1['city[1].street[''Ленина''].house[20]'].clone();  // Забираем себе в пользование. Клонируем
LJSONObject2.AddPair('city[8].street[''Победы''].house[5]', LJSONValue.clone()); // Отдаем другому объекту. Клонируем

LJSONObject2.SaveFile;
LJSONObject2.Destroy;
LJSONObject1.Destroy;

Memo1.Linex.Add('Владелец квартиры ' + LJSONValue.GetString<string>('appartment[13].owner'));
LJSONValue.Free;  // Уничтожаем свой экземпляр
try - finally добавить по вкусу
15 мар 19, 00:55    [21833145]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте лучшую по Вашему мнению библиотеку для работы с json  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 597
Ещё вопрос...

Если использовать стандартную библиотеку, там предусмотрена передачи бинарных данных ("файла" например) в тот же "Writer"?

И можно ли читать бинарные данные из json?
15 мар 19, 07:30    [21833221]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте лучшую по Вашему мнению библиотеку для работы с json  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1361
Игорь_UUS
Ещё вопрос...

Если использовать стандартную библиотеку, там предусмотрена передачи бинарных данных ("файла" например) в тот же "Writer"?

И можно ли читать бинарные данные из json?

Думаю можно через BinToHex и HexToBin преобразовать из бинарного в шеснадцатиричную строку и наоборот
15 мар 19, 09:12    [21833287]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте лучшую по Вашему мнению библиотеку для работы с json  [new]
Дегтярев Евгений
Member

Откуда: Барнаул
Сообщений: 1551
Игорь_UUS
И можно ли читать бинарные данные из json?

json - это UTF-8 текст, представь бинарные данные в виде текста и будет счастье

X-Cite
Думаю можно через BinToHex и HexToBin преобразовать из бинарного в шеснадцатиричную строку и наоборот

base64 выгоднее
15 мар 19, 09:24    [21833299]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте лучшую по Вашему мнению библиотеку для работы с json  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1361
Дегтярев Евгений
Игорь_UUS
И можно ли читать бинарные данные из json?

json - это UTF-8 текст, представь бинарные данные в виде текста и будет счастье

X-Cite
Думаю можно через BinToHex и HexToBin преобразовать из бинарного в шеснадцатиричную строку и наоборот

base64 выгоднее

Точно.. что-то не подумал...
http://docwiki.embarcadero.com/Libraries/Rio/en/System.NetEncoding.TNetEncoding
TNetEncoding.Base64.Encode()
TNetEncoding.Base64.Decode()
15 мар 19, 09:46    [21833315]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте лучшую по Вашему мнению библиотеку для работы с json  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 597
X-Cite
Дегтярев Евгений
пропущено...

json - это UTF-8 текст, представь бинарные данные в виде текста и будет счастье

пропущено...

base64 выгоднее

Точно.. что-то не подумал...
http://docwiki.embarcadero.com/Libraries/Rio/en/System.NetEncoding.TNetEncoding
TNetEncoding.Base64.Encode()
TNetEncoding.Base64.Decode()


Получается:

EncodeBytesToString.EncodeBytesToString()
EncodeBytesToString.DecodeStringToBytes()
15 мар 19, 11:29    [21833466]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте лучшую по Вашему мнению библиотеку для работы с json  [new]
Arioch
Member

Откуда:
Сообщений: 10807
_Vasilisk_
Arioch
там суть в том, что оба JSON Document я уже отдестроил, а вот после этого начинаю читать Value поддерева документа (которая была сохранена в отдельную переменную TObject)
Аналогично. Родитель уничтожает за собой всех детей.


Т.е. на пустом месте получаем use-after-free!
Отличная библиотека.

Напоминая, что в этом крайне коротком и простейшем из возможных коде - ты ошибки не видел пока я пальцем не ткнул.
В реальном сложном коде - и не увидишь.

_Vasilisk_
Должно быть
LJSONValue := LJSONObject1['city[1].street[''Ленина''].house[20]'].clone();  // Забираем себе в пользование. Клонируем
LJSONObject2.AddPair('city[8].street[''Победы''].house[5]', LJSONValue.clone()); // Отдаем другому объекту. Клонируем


Должно быть, чтобы все программы сразу писались без ошибок. Но так редко бывает.

Если библиотеке нужно что-то клонировтаь, чтобы работать без ошибок - то лучше пусть клонирует сама, не надеясь на программиста.
15 мар 19, 12:54    [21833636]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте лучшую по Вашему мнению библиотеку для работы с json  [new]
Дегтярев Евгений
Member

Откуда: Барнаул
Сообщений: 1551
Arioch
пусть клонирует сама, не надеясь на программиста.

и убьет производительность
15 мар 19, 13:00    [21833653]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте лучшую по Вашему мнению библиотеку для работы с json  [new]
Arioch
Member

Откуда:
Сообщений: 10807
Игорь_UUS
Ещё вопрос...

Если использовать стандартную библиотеку, там предусмотрена передачи бинарных данных ("файла" например) в тот же "Writer"?

И можно ли читать бинарные данные из json?


В модуле SOAP.EncdDecd - который был ещё когда System.NetEncoding не было - есть два класса TStream, которые encode и decode base64

Соответсвенно скармливаешь им TFileStream и TStringStream (через TStream.CopyFrom)

Можно и TNetEncoding.DecodeStringToBytes подвязать в IOUtils.TFile.WriteAllBytes
Но 1) "Input Strings for Decode and DecodeStringToBytes should be UTF8 encoded." - такие вещи IMHO библиотека должна сама обеспечивать. Потому что ты рано или поздно забудешь. Не говоря про лишний мусор в коде.
2) TBytes нормально сработает с маленькими файлами, так что тебе именно в этом случае париться наверное смысла нет. Но вообще с файлами заранее неизвестного размера рекомендуется работать кусками и целиком их в память не грузить.
15 мар 19, 13:03    [21833661]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте лучшую по Вашему мнению библиотеку для работы с json  [new]
Arioch
Member

Откуда:
Сообщений: 10807
Дегтярев Евгений
Arioch
пусть клонирует сама, не надеясь на программиста.

и убьет производительность


т.е. если я вызову клонирование оно отработает в разы быстрее, чем если то же клонирование вызовет библиотека ?
15 мар 19, 13:04    [21833663]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте лучшую по Вашему мнению библиотеку для работы с json  [new]
Arioch
Member

Откуда:
Сообщений: 10807
Дегтярев Евгений
Arioch
пусть клонирует сама, не надеясь на программиста.

и убьет производительность


не хочет клонировать - пусть не клонирует

но пусть не удаляет до того, как я закончл с ним работу
15 мар 19, 13:04    [21833666]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте лучшую по Вашему мнению библиотеку для работы с json  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 4488
Arioch
Дегтярев Евгений
пропущено...

и убьет производительность


не хочет клонировать - пусть не клонирует

но пусть не удаляет до того, как я закончл с ним работу
есть такое свойство

property Owned: Boolean write SetOwned;

ставь в false и удаляй сам
тогда клонировать не нужно
15 мар 19, 13:24    [21833714]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте лучшую по Вашему мнению библиотеку для работы с json  [new]
Arioch
Member

Откуда:
Сообщений: 10807
kealon(Ruslan)
ставь в false и удаляй сам
тогда клонировать не нужно


отлично! Значит библиотека его и может ставить.

мы в конце концов на ассемблере пишем, или на языке высокого уровня?

вообще, если кому-то надо проценты скорости выжимать, что вы делаете на Delphi с его знаменито-плохим оптимизатором, возхможно худшим из всех компиляторов вообще ?
15 мар 19, 13:29    [21833727]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте лучшую по Вашему мнению библиотеку для работы с json  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10857
Arioch
Напоминая, что в этом крайне коротком и простейшем из возможных коде - ты ошибки не видел пока я пальцем не ткнул.
Правильно. Потому, что передача объекта от одного родителя к другому это большая редкость.

А уничтожение родителя, а потом работа с потомком это вообще за гранью добра и зла.

Ты же не пытаешься обращаться к комбобоксу после уничтожения формы?
15 мар 19, 14:34    [21833890]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте лучшую по Вашему мнению библиотеку для работы с json  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10857
Игорь_UUS
И можно ли читать бинарные данные из json?
Есть System.JSONB. Сам не использовал, но по идее, это то, что вам нужно
15 мар 19, 14:35    [21833895]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте лучшую по Вашему мнению библиотеку для работы с json  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9710
Arioch
отлично! Значит библиотека его и может ставить.

Не может, если задуматься :)
15 мар 19, 14:40    [21833906]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте лучшую по Вашему мнению библиотеку для работы с json  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 597
Поигрался с json в поставке 10.2

конечно своеобразный подход)) по началу даже немного непонятный))


Скажите TJSONObject.ParseJSONValue - это единственная возможность начать чтение json?

например
var JSONarr : TJSONArray;
...
...

JSONarr := TJSONObject.ParseJSONValue(Memo1.Text) as TJSONArray;


к чему спрашиваю...
получается у остальных классах (например TJSONArray) возможности прочитать json нет на подобии как TJSONObject.ParseJSONValue
15 мар 19, 14:42    [21833909]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте лучшую по Вашему мнению библиотеку для работы с json  [new]
Arioch
Member

Откуда:
Сообщений: 10807
Dmitry Arefiev,

может, просто должна быть написана соответствующим образом, начиная с типов.
если в ассемблере нет контроля типов данных - это не значит, что его вообще ни в одном языке не может быть.
В C не было, а в C++ появился.

Писать на ассемблере иногда забавно. Иногда (теперь уже редко) - полезно.

Вот эта библиотека - ассемблер. В ней разложили граблей на всех поворотах "ради скорости".


_Vasilisk_
Есть System.JSONB. Сам не использовал, но по идее, это то, что вам нужно

Вряд ли. Это просто другой формат того-же JSON.
https://toster.ru/q/315910

Аналогично EBML, BinaryXML, MessagePack и т.д.

А у него задача внутри JSON передать неформатированный бинарник
15 мар 19, 15:00    [21833935]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте лучшую по Вашему мнению библиотеку для работы с json  [new]
Arioch
Member

Откуда:
Сообщений: 10807
Игорь_UUS,

возьми стандарт JSON или хотя бы просто историю откуда он взялся

JSON - это объект на языке JavaScript (изначально, сейчас чем-то уже отличается).
В терминах Delphi - record.

Может ли record быть array? нет, это разные типы.

Поэтому у array нет функции грузить себя (ParseXXXX) из record - такого просто не может быть в JSON
15 мар 19, 15:02    [21833937]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте лучшую по Вашему мнению библиотеку для работы с json  [new]
Arioch
Member

Откуда:
Сообщений: 10807
_Vasilisk_
Потому, что передача объекта от одного родителя к другому это большая редкость.


1) я ничего никуда не передавал, я просто вызвал функцию библиотеки "добавить новое значение", что она там внутри делает - это "детали реализации" прикладному программисту не нужные. Она просто должна в другом документе сделать те же дланные, и всё.

2) но это вообще не важно. Из последнего примера вообще убери второй документ - ничего не изменится.
Суть проблемы в другом, что когда я читаю данные из JsonValue (в Memo - но это частности, могу бы и в БД и куда угодно) - это JsonValue оказывается кем-то со стороны уже разрушено.

Проблема именно в этом, use after free, при том что именно я никакого free для jsonValue не делал вообще.

На каждом повороте - лежат грабли.
Зато якобы, если ты прошёл все квесты и на бегу успел увидеть и перепрыгнут ьВСЕ грабли, то у тебя будет быстрый код.

Dmitry Arefiev
в 10.3 стандартный JSON раз в 5-6 быстрее чем 10.2


Если добежишь.
Если тебе вообще был нужен тут самый-быстрый-в-мире-код в этом месте (в самом деле нужно каждую секунду новый мегабайт JSONа парсить?).

И даже при этом mORMot и JSO будут скорее всего быстрее. И тот же mORMot как заявлено работает с SON бесконечного размера.

Т.е. "стандартный" - всё равно это "грабли минус скорость".
По удобству и безопасности - ассемблер, по скорости кода - бейсик (но хороший, быстрый бейсик).
15 мар 19, 15:10    [21833947]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4 5   вперед  Ctrl      все
Все форумы / Delphi Ответить