代码之家  ›  专栏  ›  技术社区  ›  SnickersAreMyFave

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

  •  4
  • SnickersAreMyFave  · 技术社区  · 15 年前

    我有一个名为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; }
    }
    

    最简单的路线是什么?

    Config.DataSources 是 Uri s、 以及 .Skills 有 Regex s、 我现在必须反序列化(即。 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; }
    }
    

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

    我可以取消这个吗?

    1 回复  |  直到 15 年前
        1
  •  3
  •   quentin-starin    15 年前

    我经常看到这种情况。

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

    这种情况在json、自定义应用程序配置部分和命令行参数中经常出现。。举几个例子。

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

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

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

    推荐文章