【问题标题】:Serialise string properties of static, nested classes to JSON将静态嵌套类的字符串属性序列化为 JSON
【发布时间】:2013-01-11 04:29:58
【问题描述】:

给定一组静态的嵌套类,例如:

public static class LocalSiteMap
{
    public static class Navigation
    {
        public static readonly string Home = "homePage";

        public static class PageIds
        {
            public static class ShowManagement
            {
                public static readonly string Index = "showManagement";
            }

            public static class Shows
            { 
                public static readonly string Create = "addShows";
            }
        }

        public static class Actors
        {
            public static readonly string Details = "actorDetailsForm";
            public static readonly string History= "historyDetailsForm";
        }
    }
}

我想构建一个等效的 JSON 字符串,例如:

{ 'localSiteMap' : {
    { 'navigation': {
        'home': 'homePage',
        'pageIds': {
            'showManagement': {
                'index': 'showManagement'
            },
            'shows': {
                'create': 'addShows'
            }
        },
        'actors': {
            'details': 'actorDetailsForm',
            'history': 'historyDetailsForm'
        }
    }
}

每个嵌套类都会在 JSON 中生成一个嵌套对象。每个字符串属性都会在 JSON 中生成一个字符串键/值对。

我知道我可以反射根静态类并非常轻松地构建 JSON 字符串(这就是我目前正在采用的方法),但我想知道是否有更优雅的方法来做到这一点。例如,如果这是一个实例匿名类型,那么我可以serialise it pretty easily

一些背景知识:这是一组通过 WebAPI 控制器传递给在浏览器中运行的单页应用程序的常量。在 C#(服务器)和 JS(客户端)世界中使用相同的页面标识符集对于使用 Page Object pattern 的浏览器自动化测试非常有用。

“LocalSiteMap”静态类已经融入到一个相当成熟的项目中,因此将其更改为实例类或匿名类型对我来说并不是一个真正的选择。

【问题讨论】:

    标签: .net json serialization nested-class static-classes


    【解决方案1】:

    在这里构建字符串的问题是您必须确保语法 100% 正确,打开和关闭大括号,添加逗号等。所有可能但相当麻烦。

    完全避免使用魔法字符串的解决方案是使用 LINQ-to-XML 作为中间转换步骤。像这样:

    public static class NestedStaticClassWithStringPropertiesJsoniser
    {
        public static string GetJson(this Type type)
        {
            XElement rootXml = new XElement(type.Name);
            XElement xmlContent = CreateXmlTree(rootXml, type);
    
            string jsonString = JsonConvert.SerializeXNode(xmlContent);
    
            return jsonString;
        }
    
        public static XElement CreateXmlTree(XElement parent, Type type)
        {
            AddStringProperties(parent, type);
    
            AddNestedClasses(parent, type);
    
            return parent;
        }
    
        private static void AddNestedClasses(XElement parent, Type type)
        {
            var subTypes = type.GetNestedTypes();
    
            foreach (var subType in subTypes)
            {
                var newElement = new XElement(subType.Name);
                var subTree = CreateXmlTree(newElement, subType);
                parent.Add(subTree);
            }
        }
    
        private static void AddStringProperties(XElement parent, Type type)
        {
            var properties = type.GetFields();
            foreach (var property in properties)
            {
                var propertyElement = new XElement(property.Name);
                propertyElement.SetValue(property.GetValue(null));
                parent.Add(propertyElement);
            }
        }
    }
    

    它可以很容易地像这样使用:

    string json = typeof(ATypeWithNestedStaticClasses).GetJson();
    

    【讨论】:

      猜你喜欢
      • 2018-09-03
      • 1970-01-01
      • 2018-03-02
      • 1970-01-01
      • 1970-01-01
      • 2022-12-11
      • 2013-07-09
      • 1970-01-01
      相关资源
      最近更新 更多