Пользовательский маршалинг TDictionary в Delphi - PullRequest
2 голосов
/ 24 октября 2010

Мне нужно, чтобы пользовательский маршал / демаршал TDictionary в Delphi (XE).Словарь объявлен как:

TMyRecord = record
  key11: integer;
  key12: string;
  ...
end;

TMyDict: TDictionary<string, TMyRecord>;

Теперь, если я упорядочил словарь без регистрации пользовательского преобразователя, маршаллер поместит все типы полей в строку JSON - FOnValueNotify, FKeyCollection, FItems и т. Д.1004 *

Мне нужен некий ассоциативный массив ассоциативных массивов, например

{"key1":{"key11":"val1","key12":"val2"},"key2":{"key11":"val3","key12":"val4"}}

К сожалению, я не знаю, как написать собственный преобразователь и ревертер.Я использую Delphi XE и встроенные TJSONMarshal и TJSONUnMarshal.

Примечание. Использование TDictionary для этой задачи не требуется.Я просто не могу прийти с чем-то лучшим.

Ответы [ 2 ]

4 голосов
/ 25 октября 2010

Другой вариант - TSuperObject , который может маршалировать в / из JSON с использованием RTTI:

type
  TData = record
    str: string;
    int: Integer;
    bool: Boolean;
    flt: Double;
  end;
var
  ctx: TSuperRttiContext;
  data: TData;
  obj: ISuperObject;
begin
  ctx := TSuperRttiContext.Create;
  try
    data := ctx.AsType<TData>(SO('{str: "foo", int: 123, bool: true, flt: 1.23}'));
    obj := ctx.AsJson<TData>(data);
  finally
    ctx.Free;
  end;
end;
4 голосов
/ 25 октября 2010

В простом случае, подобном вашему, я склонен использовать собственный метод для представления моего объекта в JSON.Но, если вы хотите создать ревертер и конвертер, вам следует прочитать эту статью: http://www.danieleteti.it/?p=146

...