【问题标题】:Custom marshaling TDictionary in DelphiDelphi中的自定义编组TDictionary
【发布时间】:2010-10-23 22:38:07
【问题描述】:

我需要在 Delphi (XE) 中自定义编组/取消编组 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。我只是想不出更好的东西。

【问题讨论】:

  • 我真的不明白问题出在哪里。是不是你无法从字典中获取数据?无法生成 JSON 字符串?
  • 从字典中获取数据是没有问题的。我只是想不通如何编写转换器和还原函数来达到预期的结果。

标签: json delphi generics marshalling


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    另一个选项是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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-08
      • 2015-02-15
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多