我正在尝试将JSON字符串解析为C#类。 但是我无法让它发挥作用。
JSON看起来像这样
{
reports:
{
report:
{
id:"1"
step:
{
id:"2"
step:
[
{
id:"3"
step:
[
{
id:"4"
},
{
id:"5"
}
]
},
{
id:"6"
step:
{
id:"7"
}
}
]
}
}
}
}
我做了几个课来定义结构。
private class report
{
public mongoReports reports;
}
private class mongoReports
{
public mongoReport report;
}
private class mongoReport
{
public string id;
public step step;
}
private class step
{
public string id = "";
}
private class step
{
public string id = "";
public step step;
}
private class step
{
public string id = "";
public list<step> step;
}
问题在于步骤可以具有的3个定义。 1没有和step属性, 1步骤为'step'类型 1,step是“step”类型的对象列表。
如何制作适合所有这些结构的“步骤”课程?
答案 0 :(得分:0)
如果使用像Newtonsoft JSON这样的库不是一个选项,您可以考虑将解析分解为一组子解析器。即使是带字符串的构造函数,也希望它是JSON。所以你打电话给
new reports(myJSON)
和报告(字符串json)将依次调用新的
mongoReports(reportJSON)
最终你会有一个看起来像这样的电话:
new step(@"{
id:\"4\"
}"
如果您不想将其嵌入到班级本身,您可以使用工厂模式执行相同的操作,并将reports reportsCreator(string myJSON)
降至public stepCreator(string stepJSON)
但这可能需要改变你的小班的“曝光”(我不记得官方用语 - 公共/私人/受保护)。
答案 1 :(得分:0)
如果你想看一下,我在dotnetfiddle上做了一些原型。
基本上你可以有一个'root'步骤来实现'steps'的列表。然后,每个步骤都有一个从属步骤列表。然后,SingleOrArrayConverter将解析这两个列表,并根据是否有0,1或n步骤,List将填充相应的步骤对象。 JSON反序列化器在遇到JSON源中的新Step对象时递归调用自定义转换器。
类结构将如下所示:
public class Rootobject
{
public Reports reports { get; set; }
}
public class Reports
{
public Report report { get; set; }
}
public class Report
{
public string id { get; set; }
public RootStep step { get; set; }
}
public class RootStep
{
public string id { get; set; }
[JsonConverter(typeof(SingleOrArrayConverter<Step>))]
public List<Step> step { get; set; }
}
public class Step
{
public string id { get; set; }
[JsonConverter(typeof(SingleOrArrayConverter<Step>))]
public List<Step> step { get; set; }
}
这样做的好处在于,您将直接处理结果对象中的“step”类,而不是动态对象或进一步的JSON反序列化。
缺点是反序列化的JSON与输入JSON不完全匹配。我不确定这对你来说是不是一个问题,但如果是这样的话,你可以考虑修改WriteJson方法来适应这个问题。
希望有所帮助。