Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 16.05.2019, 10:13   #1
BLACK_RAIN
Участник клуба
 
Регистрация: 13.02.2012
Сообщений: 558
Репутация: 101
По умолчанию Объединить несколько 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 в 11:46.
BLACK_RAIN вне форума   Ответить с цитированием
Старый 16.05.2019, 10:44   #2
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 18,775
Репутация: 6606
По умолчанию

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

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

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

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

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

icq: 512-765
skype: alexp.frl
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
Проблема в том, что вместо \ получается \/
а проблема-то в чем?
Alex11223 на форуме   Ответить с цитированием
Старый 16.05.2019, 11:55   #7
BLACK_RAIN
Участник клуба
 
Регистрация: 13.02.2012
Сообщений: 558
Репутация: 101
По умолчанию

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

icq: 512-765
skype: alexp.frl
По умолчанию

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

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

так решили авторы либы, если там нет опций, то просто замена \/ на / в строке перед записью в файл должна работать.

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

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

icq: 512-765
skype: alexp.frl
По умолчанию

Значит его Майкрософт покусал и он не в курсе, что в url так не пишут.
Alex11223 на форуме   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


13:19.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru