Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проблема с кодировкой JSON (Embarcadero Delphi XE5) / 19 сообщений из 19, страница 1 из 1
17.07.2017, 10:00:23
    #39489961
ankonian
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
Всем привет. Есть 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
17.07.2017, 10:13:30
    #39489972
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
ankonianЗ.Ы. Читал другие темы на этом форуме и вообще в инете искал, так и не смог разобраться в чем дело/
У S.SaveToFile нет перегруженного метода вида SvaeToFile(FileName, Encoding)?.. Тогда можно попробовать разные Encoding, например:
SaveToFile(FileName, TEncoding.Unicode) или SaveToFile(FileName, TEncoding.Win1251) (не помню как Win1521 в TEncoding нзывается - хелп в помощь).
...
Рейтинг: 0 / 0
17.07.2017, 10:17:44
    #39489976
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
alekcvp,

В "нормальном" json-е строки как раз в unicode. http://www.json.org/json-ru.html
...
Рейтинг: 0 / 0
17.07.2017, 10:18:07
    #39489978
ankonian
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
alekcvp, пробовал UTF8 при приеме и передаче. Кракозябры другие становятся. Конвертирование тоже делал.
...
Рейтинг: 0 / 0
17.07.2017, 10:19:10
    #39489980
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
ankonianalekcvp, пробовал UTF8 при приеме и передаче. Кракозябры другие становятся. Конвертирование тоже делал.
Выложи сюда файлик.
...
Рейтинг: 0 / 0
17.07.2017, 10:29:55
    #39489989
krapotkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
для работы с 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
17.07.2017, 10:33:29
    #39489990
ankonian
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
чччД,
...
Рейтинг: 0 / 0
17.07.2017, 10:34:44
    #39489993
ankonian
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
krapotkin, спасибо большое! Сейчас буду пробовать.
...
Рейтинг: 0 / 0
17.07.2017, 10:46:37
    #39489999
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
ankonian,
.


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

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

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

[spoiler]
YouTube Video
...
Рейтинг: 0 / 0
17.07.2017, 11:21:45
    #39490020
ankonian
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
чччД, я знаю, что если открыть файл в редакторе, то все читается (об этом написал в первом сообщении). Проблема в компонентах delphi, которые читают этот файл.
...
Рейтинг: 0 / 0
17.07.2017, 11:23:36
    #39490022
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
ankonianПроблема в компонентах delphi, которые читают этот файл.
SaveToFile(FileName, TEncoding.Unicode)
...
Рейтинг: 0 / 0
17.07.2017, 13:22:10
    #39490140
ankonian
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
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
17.07.2017, 13:24:49
    #39490143
ankonian
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с кодировкой JSON (Embarcadero Delphi XE5)
alekcvpankonianПроблема в компонентах delphi, которые читают этот файл.
SaveToFile(FileName, TEncoding.Unicode)

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

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

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


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

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

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

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

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

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

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


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