Не за что.
Если что спрашивай.
XML формат мне всегда был противен, хоть и понятен, но все равно внутренне я был против него и как следствие принципиально не использовал в своих программах.
Но вот формат JSON мне очень понравился. Его легко написать от руки, легко читать, даже через регулярки парситься легко, если приспичило. И он не избыточен как XML, а значит по канала связи передается меньше трафика.
Так что не бросай этот формат
И кстати, что касается утечек. Я когда сам только начинал разбираться в формате JSON и с тем как работать с ним в Delphi, у меня тоже были утечки, ибо я использовал JSON для парсинга ответа с сервера, в потоке. Я тогда начал склоняться к всеобщему мнению что просто сама реализация работы с этим форматом в делфи кривая.
Но поколебавшись все таки принял во внимание ту мысль, что разработчики Embacadero на девять жизней умнее меня, и вряд ли они выпустили модуль с таким явным глюком. И решил все таки углубиться дальше.
Как оказалось просто поставить JS.Free в конце не достаточно.
Т.е. вот так вот делать не стоит:
var
JS: TJSONObject;
begin
s := '{"jsonString":"ok"};
JS := TJSONObject.ParseJSONValue(s) as TJSONObject;
ShowMessage(JS.GetValue('jsonString').Value);
JS.Free;
end;
В процессе работы потока с ним может случиться все что угодно - обрыв связи, тайоут сработает, или некорректные данные, или еще что нибудь. И JS объект может не освободиться. Т.е. поток может уже и не существует, но в оперативке созданный объект лежит.
К тому же при таком подходе могут быть и ошибки, например параметра 'jsonString' может и не быть, и все вывалиться в ошибку (но в потоке этого можно и не увидеть) и до JS.Free код никогда не дойдет. А значит будет опять утечка памяти.
Так что правильней всего делать через Assigned:
var
JS: TJSONObject;
begin
s := '{"jsonString":"ok"}';
JS := TJSONObject.ParseJSONValue(s) as TJSONObject;
if Assigned(JS) then
begin
ShowMessage(JS.GetValue('jsonString').Value);
JS.Free;
end;
end;
Тогда утечек не будет. Это я теперь точно знаю!)))