解析复杂的JSON:多个循环与类

时间:2016-07-12 06:36:16

标签: c# json parsing json.net

我有一个类型的Json:

{
"JobProcessors": [
{
  "JobName": "ArchivalJob",
  "IsEnabled": true,
  "Batching": {
    "BatchSize": 0,
    "DegreeOfParallelism": -1
  },
  "Settings": {
    "ArchivalJobCollectionPageSize": 50
  }
},
{
  "JobName": "AuditLogJob",
  "IsEnabled": false,
  "Batching": {
    "BatchSize": 10,
    "DegreeOfParallelism": -1
  },
  "Settings": {}
} 
],  
"ScheduledJobs": [
{
  "JobName": "RemoteStartClientCommandJob",
  "PrimaryAction": {
    "ConnectionString": "#JobProcessorsIntegrationSBConnectionStringValue#",
     "Settings": {
      "LeadTimeInSeconds": "600",
      "MaxSrsJobCount": 25
    }
  },
  "ErrorAction": {
    "ConnectionString": "#PairedJobProcessorIntegrationSBConnectionStringValue#",
    "EntityPath": "remotestartqueue",
    "Settings": {
      "LeadTimeInSeconds": "600",
      "MaxSrsJobCount": 25
    }
  }
}
]  
}

我想查看" IsEnabled "所有人的财产" JobName "来自" JobProcessors "类别。 在C#中,我到目前为止使用的是:

dynamic parsedJson = JsonConvert.DeserializeObject(reader.GetString(1));
foreach (var item in parsedJson)
{
    foreach (var smallitem in item)
    {
        foreach (var tag in smallitem)
        {
            if(tag.IsEnabled.toString()=="true"){
                Console.WriteLine("true");
            }                                 
        }
    }

}

这给了我正确的结果,除了它还迭代了" ScheduledJobs " 。但主要问题是:

  

这是正确或最有效的方法吗?如果可能,建议一些更好的方法

我所知道的是使用类,但我可能事先不知道json结构。此外,json非常庞大,所以制作课程可能很麻烦!!

2 个答案:

答案 0 :(得分:1)

在您的代码段中,我们使用两个foreach,它可能需要一些时间来处理大对象。所以我们可以在一个foreach中做同样的事情,或者如果你有一些特定的节点来获取或搜索我们可以使用linq,首先我们需要将我们的json对象转换为c#对象。要将Json对象转换为C#,您可以使用此站点“http://json2csharp.com/”然后我们可以将Json对象反序列化为c#。

会是这样的

string jsonString = "your Json Object as string";
        var jsonObject = JsonConvert.DeserializeObject<RootObject>(jsonString);
        foreach (JobProcessor obj in jsonObject.JobProcessors)
        {
            string JobName = obj.JobName;
            bool value=obj.IsEnabled;
        }

如果Json对象相同,我也会在c#对象中转换给定的Json,你可以直接使用这些类。

    public class Batching
    {
        public int BatchSize { get; set; }
        public int DegreeOfParallelism { get; set; }
    }

    public class Settings
    {
        public int ArchivalJobCollectionPageSize { get; set; }
    }

    public class JobProcessor
    {
        public string JobName { get; set; }
        public bool IsEnabled { get; set; }
        public Batching Batching { get; set; }
        public Settings Settings { get; set; }
    }

    public class Settings2
    {
        public string LeadTimeInSeconds { get; set; }
        public int MaxSrsJobCount { get; set; }
    }

    public class PrimaryAction
    {
        public string ConnectionString { get; set; }
        public Settings2 Settings { get; set; }
    }

    public class Settings3
    {
        public string LeadTimeInSeconds { get; set; }
        public int MaxSrsJobCount { get; set; }
    }

    public class ErrorAction
    {
        public string ConnectionString { get; set; }
        public string EntityPath { get; set; }
        public Settings3 Settings { get; set; }
    }

    public class ScheduledJob
    {
        public string JobName { get; set; }
        public PrimaryAction PrimaryAction { get; set; }
        public ErrorAction ErrorAction { get; set; }
    }

    public class RootObject
    {
        public List<JobProcessor> JobProcessors { get; set; }
        public List<ScheduledJob> ScheduledJobs { get; set; }
    }

希望这会有所帮助。 谢谢

答案 1 :(得分:1)

鉴于您已经在JObject.Parse(jsonstring);解析JSON字符串,您可以使用SelectTokens()JSONPath query来查找所有&#34; JobName&#34; &#34; JobProcessors&#34;:

下的对象
// I want to check the "IsEnabled" property for all "JobName" for which come under "JobProcessors" 
foreach (var job in root.SelectTokens("..JobProcessors[?(@.JobName)]"))
{
    var isEnabled = (bool?)job["IsEnabled"];
    Debug.WriteLine(string.Format("Job {0}: IsEnabled={1}", job["JobName"], isEnabled));
}

注意:

  • ..递归下降运算符:它以递归方式下降返回每个项目的JToken层次结构,随后与查询字符串的其余部分进行匹配

  • JobProcessors返回该名称的属性值。

  • [?(@.JobName)]返回具有JobProcessors属性的对象的数组项(在本例中为JobName)。

  • (bool?)强制转换&#34; IsEnabled&#34;如果缺少布尔值或null。

这个的输出是:

Job ArchivalJob: IsEnabled=True
Job AuditLogJob: IsEnabled=False