powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проблема с кодировкой JSON (Embarcadero Delphi XE5)
19 сообщений из 19, страница 1 из 1
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
    #39489961
ankonian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет. Есть 2 программы: одна заливает обновление на сервер, другая - скачивает. На сервер заливается само обновление (exe-шник) и json-файл с метаифнормацией с помощью скрипта WinSCP.

Структура json такая:

{"version":"1.0.20.0",
"cdate":"17.07.2017",
"file":"Setup_System.exe",
"changes":["Изменили дизайн","исправили ошибки","и т.д."]}

Поле Changes это изменения в новой версии.

На сервер заливается нормальный json (в кодировке ANSI), все читабельно, а когда получаю json с сервера, то в массиве changes кракозябры.
К серверу подключаюсь через TIdHttp.

Создание json на клиенте:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
function TForm1.SaveToJson(): boolean;
var
  JSONObject: TJSONObject;
  Pair: TJSONPair;
  JsonArray: TJSONArray;
  S: TStringList;
  i: integer;
begin
  S := TStringList.Create;
try
  Result := true;
  JSONObject := TJSONObject.Create;
  Pair := TJSONPair.Create('version', currentVersion);
  JSONObject.AddPair(Pair);
  Pair := TJSONPair.Create('cdate', DateToStr(dtpCurrentDate.DateTime));
  JSONObject.AddPair(Pair);
  Pair := TJSONPair.Create('file', GetFileName());
  JSONObject.AddPair(Pair);

  JsonArray := TJSONArray.Create();
  for i := 0 to mmoWhatsNew.Lines.Count - 1 do
  begin
    if Length(mmoWhatsNew.Lines[i]) > 0 then
      JsonArray.Add(mmoWhatsNew.Lines[i]);
  end;
  JSONObject.AddPair('changes',JsonArray);

  S.Add(JSONObject.ToString);
  S.SaveToFile(pathToUploader + 'release\' + jsonFile, TEncoding.ANSI);

  S.Free;
  JSONObject.Destroy;
end;



Чтение json-а:
Код: pascal
1.
2.
3.
4.
5.
6.
json := Connect.Get(ServiceURL);
JsonMeta := TJSONObject.ParseJSONValue(TEncoding.ANSI.GetBytes(json), 0) as TJSONObject;

Distrib := jsonMeta.GetValue('file').Value;
CDate := jsonMeta.GetValue('cdate').Value;
Changes := jsonMeta.Get('changes').JsonValue as TJSONArray;



З.Ы. Читал другие темы на этом форуме и вообще в инете искал, так и не смог разобраться в чем дело/
...
Рейтинг: 0 / 0
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
    #39489972
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ankonianЗ.Ы. Читал другие темы на этом форуме и вообще в инете искал, так и не смог разобраться в чем дело/
У S.SaveToFile нет перегруженного метода вида SvaeToFile(FileName, Encoding)?.. Тогда можно попробовать разные Encoding, например:
SaveToFile(FileName, TEncoding.Unicode) или SaveToFile(FileName, TEncoding.Win1251) (не помню как Win1521 в TEncoding нзывается - хелп в помощь).
...
Рейтинг: 0 / 0
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
    #39489976
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

В "нормальном" json-е строки как раз в unicode. http://www.json.org/json-ru.html
...
Рейтинг: 0 / 0
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
    #39489978
ankonian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp, пробовал UTF8 при приеме и передаче. Кракозябры другие становятся. Конвертирование тоже делал.
...
Рейтинг: 0 / 0
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
    #39489980
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ankonianalekcvp, пробовал UTF8 при приеме и передаче. Кракозябры другие становятся. Конвертирование тоже делал.
Выложи сюда файлик.
...
Рейтинг: 0 / 0
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
    #39489989
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для работы с JSON очень неудобны встроенные классы. гораздо лучше воспользоваться XSuperObject
на github абсолютно фри

кодировка должна быть UTF8 по-любому, и не нужны никакие TEncoding.GetBytes и т.п.
Код: pascal
1.
2.
3.
4.
5.
6.
var X:ISuperObject;
json:string;

json := IdHttp.Get(URL, Parrams);
X:=TSuperObject.Create(json);
showMessage(X.A['changes'].S[0])
...
Рейтинг: 0 / 0
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
    #39489990
ankonian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чччД,
...
Рейтинг: 0 / 0
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
    #39489993
ankonian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krapotkin, спасибо большое! Сейчас буду пробовать.
...
Рейтинг: 0 / 0
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
    #39489999
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ankonian,
.


...я файлик с "неправильным" json приложить просил.
...
Рейтинг: 0 / 0
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
    #39490006
ankonian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чччД,
...
Рейтинг: 0 / 0
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
    #39490016
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ankonian,

это json - файл, но строки в Win-1251 кодировке.

Вроде ты этого и хотел?

[spoiler]
YouTube Video
...
Рейтинг: 0 / 0
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
    #39490020
ankonian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чччД, я знаю, что если открыть файл в редакторе, то все читается (об этом написал в первом сообщении). Проблема в компонентах delphi, которые читают этот файл.
...
Рейтинг: 0 / 0
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
    #39490022
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ankonianПроблема в компонентах delphi, которые читают этот файл.
SaveToFile(FileName, TEncoding.Unicode)
...
Рейтинг: 0 / 0
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
    #39490140
ankonian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krapotkinдля работы с JSON очень неудобны встроенные классы. гораздо лучше воспользоваться XSuperObject
на github абсолютно фри

кодировка должна быть UTF8 по-любому, и не нужны никакие TEncoding.GetBytes и т.п.


Спасибо большое. С SuperObject все заработало.

Пока сделал костыльно с записью в файл, позже исправлю. Код для примера если кому-нибудь понадобится:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
var
str: string;
so: ISuperObject;
ms: TMemoryStream;

ms := TMemoryStream.Create;
idhtp1.Get(URL, ms);

ms.SaveToFile(ExtractFileDir(ParamStr(0)) + '\123.json');

str := TFile.ReadAllText(ExtractFileDir(ParamStr(0)) + '\123.json', TEncoding.UTF8);
so := TSuperObject.Create(str);
str := so.A['changes'].S[0];
mmoOutput.Lines.Add(str);



Без файла строку из MemoryStream не может разобрать - вываливается ошибка.
...
Рейтинг: 0 / 0
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
    #39490143
ankonian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvpankonianПроблема в компонентах delphi, которые читают этот файл.
SaveToFile(FileName, TEncoding.Unicode)

С записью файла у меня все было нормально, этот вариант функции тоже использовал. Проблемы были при чтении.

Всем спасибо за помощь. :-)
...
Рейтинг: 0 / 0
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
    #39490305
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
писать в файл, чтобы потом его читать - это знатное извращение.

var JsonObject: ISuperObject;
ResponseStr := fGameIdHTTP.post(URLStr,LParams);
JsonObject := SO(JSONString);


вся суть в двух строках.

проверки на пустой ответ, правильный формат и прочее, прочее - на свой вкус.
...
Рейтинг: 0 / 0
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
    #39490597
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чем xSuperObject лучше родного SuperObject ?

вроде по тестам он медленнее, а плюсы у него какие ?
...
Рейтинг: 0 / 0
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
    #39490607
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вроде синтаксис еще сахарнее и поддержка дельфей начинается с более старших версий
т.е версия дельфи не новая берез без X, новая с X
это если на пальцах :)
...
Рейтинг: 0 / 0
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
    #39490620
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
энди,

Хм.... Вообще-то Анри, пока его борманы не обломали и он еще дельфями занимался, как раз на новые версии и ориентировался.

Т.е. да, потом он в SuperObject Добавил поддержку D7 "по просьбам трудящихся", потом поломал, потом снова поправил и т.д.

А в иксе, видимо, не заморачивались и не стали даже пытаться исправить.
Я когда-то реально пытался понять, на хрена его форкнули, но так и не понял.

PS. а наиболее быстрый с прицелом на обязательную поддержку D7 и FPC - пожалуй mORMot
Хотя мне в json'е никогда не приходилось выжимать скорость
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проблема с кодировкой JSON (Embarcadero Delphi XE5)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]