在Delphi中自定义编组TDictionary

时间:2010-10-23 22:38:08

标签: json delphi generics marshalling

我需要在Delphi(XE)中定制mabalhal / unmarchal TDictionary。字典声明为:

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

TMyDict: TDictionary<string, TMyRecord>;

现在,如果我在没有注册自定义转换器的情况下编组字典,编组器会将所有类型的字段放在JSON字符串中 - FOnValueNotify,FKeyCollection,FItems等。

我需要的是某种关联数组的关联数组,即

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

不幸的是,我不知道如何编写自定义转换器和还原器。我正在使用Delphi XE和内置的TJSONMarshal和TJSONUnMarshal。

注意:不需要使用TDictionary执行此任务。我只是不能得到更好的东西。

2 个答案:

答案 0 :(得分:4)

对于像你这样的简单案例,我倾向于使用自定义方法在JSON中表示我的对象。但是,如果你想创建转换器和转换器,你应该阅读这篇文章: http://www.danieleteti.it/?p=146

答案 1 :(得分:4)

另一个选项是TSuperObject,它可以使用RTTI编组进出JSON:

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;