【问题标题】:AutoMapper Custom type converter ITypeConverter and mapping nested objectsAutoMapper 自定义类型转换器 ITypeConverter 和映射嵌套对象
【发布时间】:2017-03-15 23:03:44
【问题描述】:

我正在尝试映射 C# 字典集合

IDictionary<string, object>

进入 MATLAB 中使用的特定对象(MWStructArrayMWCellArray)。 该集合包含已解析的 JSON 结构。

为此,我使用 AutoMapper 及其 ITypeConverter 实现,目前看起来像:

Mapper.Initialize(cfg =>
{
    cfg.CreateMap<IDictionary<string, object>, MWStructArray>().ConvertUsing(new MWStructArrayTypeConverter());
});
Mapper.AssertConfigurationIsValid();


public class MWStructArrayTypeConverter : ITypeConverter<IDictionary<string, object>, MWStructArray>
{
    public MWStructArray Convert(ResolutionContext context)
    {
        var dictionary = context.SourceValue as Dictionary<string, object>;
        var mwStructArray = new MWStructArray(1, 1, dictionary.Keys.ToArray());

        foreach (KeyValuePair<string, object> entry in dictionary)
        {
            mwStructArray[entry.Key, 1] = entry.Value.ToString();
        }

        return mwStructArray;
    }
}

我的字典保存单个值,如 int、string、float 等,但它可以保存另一个嵌套字典或 List 数组。即

IDictionary<string, IDictionary<string, object>>

IDictionary<string, List<object>>

如果是嵌套集合,我不知道如何递归地映射它们。

任何建议将不胜感激。

【问题讨论】:

  • 您能否在 MATLAB 中提供输入 JSON 和所需输出的小样本?您是否仅限于 C# 或者您可以使用其他语言(也许 python、mex 或 java 接口会有所帮助)?如果您的数据结构是统一的,也许可以为您的特定模式编写一个解析器,它可以快速运行......
  • 感谢您的关注。 efredin 已经提供了可行的解决方案。我测试了它,它是完美的。我还没有彻底测试它,但到目前为止我所做的很少有测试表明解析时间至少下降了 10 倍,这非常令人满意。
  • 好吧,我测试了它并调用: context.Mapper.Map(entry.Value) 抛出一个关于无法将 JObiect 映射到 MWArray 的异常

标签: c# json matlab performance automapper


【解决方案1】:

您可以使用传递给 convert 方法的上下文对象递归映射。

public MWStructArray Convert(ResolutionContext context)
    {
        var dictionary = context.SourceValue as Dictionary<string, object>;
        var mwStructArray = new MWStructArray(1, 1, dictionary.Keys.ToArray());

        foreach (KeyValuePair<string, object> entry in dictionary)
        {
            if (entry.Value is IDictionary)
            {
                mwStructArray[entry.Key, 1] = context.Mapper.Map<MWStructArray>(entry.Value)
            }
            else
            {
                mwStructArray[entry.Key, 1] = entry.Value.ToString();
            }
        }

        return mwStructArray;
    }

【讨论】:

  • 工作就像一个魅力。非常非常非常感谢您,非常非常非常 :-)
【解决方案2】:

我不想编辑 efredin 的答案,因为它在他的系统上可能完全正确,但就我而言,我不得不稍微修改他的代码,现在看起来像这样:

    public MWStructArray Convert(ResolutionContext context)
    {
        var dictionary = context.SourceValue as Dictionary<string, object>;
        var mwStructArray = new MWStructArray(1, 1, dictionary.Keys.ToArray());

        foreach (KeyValuePair<string, object> entry in dictionary)
        {
            if (entry.Value is IDictionary)
            {
                mwStructArray[entry.Key, 1] = context.Engine.Map<MWStructArray>(entry.Value);
            }
            else
            {
                mwStructArray[entry.Key, 1] = entry.Value.ToString();
            }
        }

        return mwStructArray;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-20
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2020-04-03
    • 1970-01-01
    相关资源
    最近更新 更多