Чем конвертнуть raw_unicode-текст в json на Delphi 7 ?

Softologic
Дата: 22.12.2019 01:38:42
Есть такой ответ от сервера (где word press наколдовал:)) в виде json:
"{"code":99003,"message":"\u0417\u0430\u043a\u0430\u0437, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c, \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445","data":{}}"

Чем конвертнуть вот эти вот все "\u0417\u0430\u043a\......" в кириллический текст, коим он должен быть для пользователя в итоге?
Ситуация немного осложняется тем, что допиливаю проект древний, еще на D7 :((
rgreat
Дата: 22.12.2019 01:43:59
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;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Caption := Convert('abc \u0430\u0431\u0432\u0433');
end;
asviridenkov
Дата: 22.12.2019 01:52:55
У вас же HCL есть, достаточно htxml подключить

var XN: THtXMLNode;
begin
XN := THtXMLNode.CreatefromJSON(s);
ShowMessage(XN['message']);
ёёёёё
Дата: 22.12.2019 02:13:31
Softologic,

Очень просто, грузишь его в суперобджект, и сохраняешь методом .asJSON с параметрами true, false. Две строки кода.
Softologic
Дата: 22.12.2019 10:03:28
asviridenkov,

Спасибо! Попробую.
Softologic
Дата: 22.12.2019 10:14:55
rgreat
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;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Caption := Convert('abc \u0430\u0431\u0432\u0433');
end;


Спасибо!
Softologic
Дата: 22.12.2019 10:25:05
asviridenkov
У вас же HCL есть, достаточно htxml подключить

var XN: THtXMLNode;
begin
XN := THtXMLNode.CreatefromJSON(s);
ShowMessage(XN['message']);


Александр, ваш код возвращает вот такую штуку: "0:07, :>B>@K9 2K E>B8B5 4>1028BL, C65 5ABL 2 1075 40==KE"
Softologic
Дата: 22.12.2019 10:58:40
rgreat,

ваш код возвращает тоже самое: "0:07, :>B>@K9 2K E>B8B5 4>1028BL, C65 5ABL 2 1075 40==KE".
Что то не очень похоже на utf8, и любые попытки перевести из utf8 в ansi ничего не дали... что я делаю не так?
ёёёёё
Дата: 22.12.2019 12:09:50
Softologic,

uses superobject,...;
...
var
  fSrc : WideString;
  fSO : ISuperObject;
  fResult : AnsiString;
...
begin
  fSrc := ...;
  fSO := SO(fSrc);
  fResult := fSO.AsJSON(true, false);
Polesov
Дата: 22.12.2019 12:13:47
rgreat
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;


Немного подправил код:
function Convert( const InText : string ) : string;
var
  i : integer;
  c : WideChar;
  n : string;
begin
  Result := InText;
  i := Pos( '\u', Result );
  while i > 0 do
  begin
    n := Copy( Result, i + 2, 4 );
    c := WideChar( StrToInt( '$' + n ) );
    Result := StringReplace( Result, '\u' + n, c, [rfReplaceAll, rfIgnoreCase] );
    i := Pos( '\u', Result );
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Caption := Convert('abc \u0430\u0431\u0432\u0433 def');
end;


В данном варианте результат 'abc абвг def' (проверял на D5).

Вся исходная строка преобразовалась в:
'{"code":99003,"message":"Заказ, который вы хотите добавить, уже есть в базе данных","data":{}}'