powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование XSuperObject для сериалиpации, десериализации классов Delphi
8 сообщений из 8, страница 1 из 1
Использование XSuperObject для сериалиpации, десериализации классов Delphi
    #39737865
k.besedin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня мудрецы!
Использую класс XSuperObject для перевода класса в json строку и обратно.
Все бы ничего, но при вызове метода AsJSON с кириллицей json строка становится такой:
'"Поиск по фамилии, имени (отчеству"' к примеру.

Как сделать так, чтобы она отображалась в нормальной кодировке с кириллицей и нормально работала при вызове AssignFromJSON с этой кодировкой?
...
Рейтинг: 0 / 0
Использование XSuperObject для сериалиpации, десериализации классов Delphi
    #39737898
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k.besedin,

Посмотреть в доках/настройках, зачем там простые юникодные символы экранирует. Возможно, компонент думает, что в анси, не utf хотят выгрузить. Гугл подсказывает, что результат можно вручную преобразовывать:
https://bitbucket.org/vkrapotkin/unescapejson/src/934dc8bdc66106816939c81a1ab4b91d65287008/UUnescapeJSON.pas?at=master&fileviewer=file-view-default

Но это так себе решение, на черный день.
...
Рейтинг: 0 / 0
Использование XSuperObject для сериалиpации, десериализации классов Delphi
    #39737922
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k.besedinДоброго дня мудрецы!
Использую класс XSuperObject для перевода класса в json строку и обратно.
Все бы ничего, но при вызове метода AsJSON с кириллицей json строка становится такой:
'"Поиск по фамилии, имени (отчеству"' к примеру.

Как сделать так, чтобы она отображалась в нормальной кодировке с кириллицей и нормально работала при вызове AssignFromJSON с этой кодировкой?Стандартный System.Json прекрасно справляется с этой ситуацией, что еще раз подтверждает ущербность XSuperObject))))
...
Рейтинг: 0 / 0
Использование XSuperObject для сериалиpации, десериализации классов Delphi
    #39738108
k.besedin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решил проблему таким образом:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
function Convert(const InText: string): string;
var
  i, op: Integer;
  c: Char;
  t, n: string;
begin
  i := 1;
  op := 1;
  while PosEx('\u', InText, i) <> 0 do
  begin
    i := PosEx('\u', InText, i);
    t := t + Copy(InText, op, i - op);
    Inc(i, 2);
    n := Copy(InText, i, 4);
    op := i + 4;
    c := Char(StrToInt('$' + n));
    t := t + WideString(c);
  end;
  t := t + Copy(InText, op, Length(InText));
  Result := t;
end;
...
Рейтинг: 0 / 0
Использование XSuperObject для сериалиpации, десериализации классов Delphi
    #39738111
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k.besedin,

Данная функция называется - "привет из будущего".
...
Рейтинг: 0 / 0
Использование XSuperObject для сериалиpации, десериализации классов Delphi
    #39738112
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k.besedinДоброго дня мудрецы!
Использую класс XSuperObject для перевода класса в json строку и обратно.
Все бы ничего, но при вызове метода AsJSON с кириллицей json строка становится такой:
'"Поиск по фамилии, имени (отчеству"' к примеру.

Как сделать так, чтобы она отображалась в нормальной кодировке с кириллицей и нормально работала при вызове AssignFromJSON с этой кодировкой?

Сие поведение скорее всего правильно, ибо результат пригоден для использования в парсерах, принимающих хоть юникодные, хоть ANSIшные строки. Да и какая нафик разница, как оно там в файле закодировано?
Отчего так
Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
  function ChrToUTF16(const ChrCode: Integer): String; inline;
  begin
     Result := '\u' +
               HexMap[ChrCode shr 12] +
               HexMap[(ChrCode shr 8) and 15] +
               HexMap[(ChrCode shr 4) and 15] +
               HexMap[ChrCode and 15];
  end;

  function StrToUTF16(const Str: String): String;
  var
    Tmp: PWideChar;
  begin
    if Str = #0 then Exit(ChrToUtf16(0));
    Result := '';
    if Str = '' then
       Exit
    else
       Tmp := PWideChar(Pointer(Str));
    while Tmp^ <> #0 do
    begin
      case Tmp^ of
        #1..#31: case Tmp^ of
                  #8 : Result := Result + '\b';
                  #9 : Result := Result + '\t';
                  #10: Result := Result + '\n';
                  //#11: Result := Result + '\v';
                  #12: Result := Result + '\f';
                  #13: Result := Result + '\r';
               else
                  Result := Result + ChrtoUTF16(Ord(Tmp^))
               end;
        #34{"}: Result := Result + '\"';
        #92{\}: Result := Result + '\\';
        #127..#65535: Result := Result + ChrtoUTF16(Ord(Tmp^));
      else
        Result := Result + Tmp^;
      end;
      Inc(Tmp);
    end;
  end;



А если тебе все же хочется "красиво", то просто закомментируй эту строчку:
Код: pascal
1.
        #127..#65535: Result := Result + ChrtoUTF16(Ord(Tmp^));


Или измени диапазон #127..#65535 так, чтобы кириллица в него не попадала.
...
Рейтинг: 0 / 0
Использование XSuperObject для сериалиpации, десериализации классов Delphi
    #39738114
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k.besedinРешил проблему таким образом:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
function Convert(const InText: string): string;
var
  i, op: Integer;
  c: Char;
  t, n: string;
begin
  i := 1;
  op := 1;
  while PosEx('\u', InText, i) <> 0 do
  begin
    i := PosEx('\u', InText, i);
    t := t + Copy(InText, op, i - op);
    Inc(i, 2);
    n := Copy(InText, i, 4);
    op := i + 4;
    c := Char(StrToInt('$' + n));
    t := t + WideString(c);
  end;
  t := t + Copy(InText, op, Length(InText));
  Result := t;
end;


Товарищ, а если во входном потоке появятся управляющие символы (те, что в С принято обозначать '\b', '\t', '\n', '\v', '\f', '\r'), или символы 1 (одинарная кавычка), " (двойная кавычка), / (слэш), \ (обратный слэш), символ с кодом 0 и т.д.?
...
Рейтинг: 0 / 0
Использование XSuperObject для сериалиpации, десериализации классов Delphi
    #39738176
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k.besedinРешил проблему таким образом:

Код: pascal
1.
2.
3.
while PosEx('\u', InText, i) <> 0 do
  begin
    i := PosEx('\u', InText, i);


...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование XSuperObject для сериалиpации, десериализации классов Delphi
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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