Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2019, 09:13   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию Объединить несколько JSON в один

Здравствуйте.
Необходимо получить от сервера несколько JSON'ов и объединить их в массив в другом JSON'е.
Код:
var
  json, JsonToSave, jo : TJSONObject;
  jp : TJSONPair;
  jsonArr, jsa : TJSONArray;
  buf : AnsiString;
  t, JsonText : string;
  sl : TStrings;
begin
    JsonToSave := TJSONObject.Create; //в него надо объединить
    jsa := TJSONArray.Create;
    jp := TJSONPair.Create('videos', jsa);
потом в цикле принимаю JSON'ы:
Код:
//buf - принятый JSON
  t := UTF8ToString(buf);
  jo := TJSONObject.ParseJSONValue(t) as TJSONObject;
  jsa.AddElement(jo);
а после цикла сохраняю в файл:
Код:
    JsonToSave.AddPair(jp);
    if not DirectoryExists(cfg.TempPath) then
    ForceDirectories(cfg.TempPath);
    if DirectoryExists(cfg.TempPath) then
    begin
      t := cfg.TempPath + FormatDateTime('"get_' + ui.Name +
          '_"yyyy-mm-dd, hh-mm-ss".json', Now);
      SaveStringToFile2(JsonToSave.ToJSON, t);
    end;
    JsonToSave.Free;
	
	
procedure SaveStringToFile2(t, fn : string);
var
  sl : TStrings;
begin
  sl := TStringList.Create;
  sl.Text := t;
  if FileExists(fn) then
  DeleteFile(fn);
  sl.SaveToFile(fn);
  sl.Free;
end;
Проблема в том, что вместо \ получается \/.
например:
Код:
			"url": "https:\/\/www.twitch.tv\/videos\/423386885",
StringReplace() не помогает.

Последний раз редактировалось BLACK_RAIN; 16.05.2019 в 10:46.
BLACK_RAIN вне форума Ответить с цитированием
Старый 16.05.2019, 09:44   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

и так не помогает?
Код:
sl.Text := StringReplace(t,'\/','\',[rfReplaceAll]);
только json в файле невалидным будет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.05.2019, 10:13   #3
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
и так не помогает?
Код:
sl.Text := StringReplace(t,'\/','\',[rfReplaceAll]);
неа. В t нету никаких \, а при добавлении в массив они откуда-то появляются.

Цитата:
Сообщение от Аватар Посмотреть сообщение
только json в файле невалидным будет
почему? как сделать валидным? все ноды перебирать и по одной добавлять? Это ведь извращение
BLACK_RAIN вне форума Ответить с цитированием
Старый 16.05.2019, 10:29   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Символ \ в json специальный и используется для экранирования других спец.символов, в том числе и символов / и \. Вот они и добавились при добавлении в массив строки https: //www.twitch.tv/videos/423386885
Цитата:
В t нету никаких \
Есть, в процедуре SaveStringToFile2
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.05.2019, 10:44   #5
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Есть, в процедуре SaveStringToFile2
А, вы про эту t.
Но если сделать там StringReplace(), он нормально не выполнится. Строка слишком длинная. Ближе к концу, текст ломается в аццкое крошево.
но даже если бы и сработало, то вы же говорите, что JSON станет невалидным.
А что тогда делать?
BLACK_RAIN вне форума Ответить с цитированием
Старый 16.05.2019, 10:47   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
Проблема в том, что вместо \ получается \/
а проблема-то в чем?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 16.05.2019, 10:55   #7
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
а проблема-то в чем?
Этот JSON нужно читать как в программе, так и в блокноте. А с экранирующими символами это делать не удобно.
Почему их нельзя просто убрать? Почему от этого JSON становится невалидным? В оригинале же нет этих символов, а файл валидный.
BLACK_RAIN вне форума Ответить с цитированием
Старый 16.05.2019, 11:07   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
Почему от этого JSON становится невалидным?
не становится, по крайней мере согласно ECMA 404, RFC 4627.

это только при вставке в <script> в HTML может иметь значение (нельзя </, хотя и то может только в старых спецификациях HTML).

так решили авторы либы, если там нет опций, то просто замена \/ на / в строке перед записью в файл должна работать.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 16.05.2019 в 11:12.
Alex11223 вне форума Ответить с цитированием
Старый 16.05.2019, 11:20   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

ТС же хочет заменить \/ на \
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.05.2019, 11:24   #10
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Значит его Майкрософт покусал и он не в курсе, что в url так не пишут.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объединить несколько dxf в один MKLAZ Фриланс 7 18.11.2022 06:10
Как объединить несколько запросов в один? Tagir93 PHP 14 07.02.2017 18:26
Объединить несколько dxf в один rustam-sh Фриланс 1 04.12.2015 16:35
Как правильно объединить несколько одинаковых стилей CSS в один файл? -=ButCheR=- HTML и CSS 1 30.10.2010 08:21
Слить-объединить несколько файлов в один SLP Microsoft Office Excel 2 19.11.2008 18:13