C#:将JSON原语反序列化为.NET复杂类型

C#:将JSON原语反序列化为.NET复杂类型,c#,.net,json,serialization,C#,.net,Json,Serialization,我有一个名为config.json的文件。内容如下: { dataSources: [ "http://www.blahblah.com/blah", "http://www.blahblah.com/blah2", ... ], skills: [ { "name": "foobaris", "regex": "pattern"

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

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

    skills:
    [
        {
            "name": "foobaris",
            "regex": "pattern"
        },
        ...
    ]
}
我想用这些数据尽可能简单、简洁地创建一个
Config
对象<代码>配置定义为:

public class Config
{
    public IEnumerable<Uri> DataSources { get; set; }
    public IEnumerable<KeyValuePair<string, Regex>> Skills { get; set; }
}
…然后将该结构转换为
配置
(例如
新配置(rawConfig)


我可以取消这个吗?

我经常看到这种情况

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

json、自定义应用程序配置部分和命令行参数似乎经常发生这种情况。。仅举几个例子

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

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

我们只是想了解这样一个事实:试图让解析工具输出我们想要的精确对象图几乎总是比它的价值更麻烦

当然,很多事情可以使第二步变得更简单——LINQ到对象表达式、自动映射等等

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; }
}