给定一组静态的嵌套类,例如:
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 Controller传递给浏览器中运行的单页应用程序的常量。在C#(服务器)和JS(客户端)世界中使用相同的页面标识符集对于使用Page Object pattern的浏览器自动化测试非常有用。
'LocalSiteMap'静态类已经被用于相当成熟的项目,因此将其更改为实例类或匿名类型对我来说并不是一个真正的选择。
答案 0 :(得分:0)
在这里构建字符串的问题是你必须确保语法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();