我有一个类型的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非常庞大,所以制作课程可能很麻烦!!
答案 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