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

时间:2010-10-27 17:16:50

标签: c# .net json serialization

我有一个名为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))。

我可以取消这个吗?

1 个答案:

答案 0 :(得分:3)

我经常看到这种情况。

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

这经常发生在json,自定义应用程序配置部分,使用命令行参数......仅举几个场景。

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

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

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

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