C#解析递归json

时间:2018-04-19 14:31:47

标签: c# json mongodb recursion

我正在尝试将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”类型的对象列表。

如何制作适合所有这些结构的“步骤”课程?

2 个答案:

答案 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上做了一些原型。

JSON Recursive Example

基本上你可以有一个'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方法来适应这个问题。

希望有所帮助。