我需要在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执行此任务。我只是不能得到更好的东西。
答案 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;