2010-10-27 58 views
4

我有一个名为config.json的文件。下面是它的内容:C#:将JSON原语反序列化为.NET复杂类型

{ 
    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 S,我现在必须derserialize(即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))。

我可以无效吗?

回答

3

我经常看到这种情况。

我们有一些数据需要从文本格式中解析出来,我们有一些工具可以为我们进行解析,而我们需要在我们自己的某个特定对象图中得到结果。

这种情况经常发生在json,自定义应用程序配置部分,命令行参数中......这仅仅是为了举出一些场景。

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

试图一举实现它通常会使它比需要更复杂。在一个方法调用下封装这两个操作并完成它。

我们只是试图让解析工具输出我们想要的确切对象图的事实几乎总是比它的价值更麻烦。

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