我有一个名为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.DataSources
为Uri
,而.Skills
有Regex
,因此我目前必须将配置文件驱动(即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)
)。
我可以取消这个吗?
答案 0 :(得分:3)
我经常看到这种情况。
我们有一些需要从文本格式解析的数据,我们有工具为我们解析,我们需要在我们自己的某个特定对象图中得到结果。
这经常发生在json,自定义应用程序配置部分,使用命令行参数......仅举几个场景。
在这些情况下,我个人更喜欢将步骤分开。使用工具/库(在您的情况下,JavaScriptSerializer)将文本解析为中间对象。然后将中间对象映射到最终对象(换句话说,就是你正在做的事情)。
尝试一举完成它通常会使它变得比它需要的更复杂。在一个方法调用下封装这两个操作并完成它。
我们只是尝试让解析工具输出我们想要的确切对象图,这几乎总是比它的价值更麻烦。
当然,很多事情可以使第二步更简单 - LINQ到对象表达式,AutoMapper等。