我有一个名为config.json的文件。其内容如下:

{
    dataSources:
    [
        "http://www.blahblah.com/blah",
        "http://www.blahblah.com/blah2",
        ...
    ],

    skills:
    [
        {
            "name": "foobaris",
            "regex": "pattern"
        },
        ...
    ]
}


我想根据此数据创建一个Config对象,并且尽可能简单。 Config定义为:

public class Config
{
    public IEnumerable<Uri> DataSources { get; set; }
    public IEnumerable<KeyValuePair<string, Regex>> Skills { get; set; }
}


最简单的路线是什么?

因为Config.DataSourcesUri,而.SkillsRegex,所以我目前必须首先将配置文件反序列化(即RawConfig rawConfig = new JavaScriptSerializer().Deserialize<RawConfig>(configFileContents))到该结构中:

public struct RawConfig
{
    public IEnumerable<string> DataSources { get; set; }
    public IEnumerable<RawConfigSkill> Skills { get; set; }
}

public struct RawConfigSkill
{
    public string Name { get; set; }
    public string Regex { get; set; }
}


...然后将该结构转换为Config(例如new Config(rawConfig))。

我可以取消这个吗?

最佳答案

我经常看到这种情况。

我们有一些需要从文本格式解析的数据,并且我们有为我们进行解析的工具,并且我们需要在自己的某些特定对象图中生成结果。

这在json,带有自定义应用程序配置节,带有命令行参数..的情况下似乎经常发生,仅举几个例子。

在这些情况下,我个人更希望将步骤分开。使用工具/库(在您的情况下为JavaScriptSerializer)将文本解析为中间对象。然后将中间对象映射到最终对象(换句话说,就是您已经在做的事情)。

试图一口气完成它通常会使它变得比需要的复杂。将两个操作封装在一个方法调用下,并用它完成。

我们只是想得到这样一个事实,即试图让解析工具输出所需的确切对象图几乎总是比其价值更大的麻烦。

当然,很多事情可以使第二步变得更简单-LINQ到对象表达式,AutoMapper等。

10-05 20:43