使用数组和对象遍历 JSON
Iterate through JSON with Arrays and Objects
我以下面的 JSON 响应为例,我需要存储 System.State 从 x 变为 y 的次数。最终结果会将日期存储在文件中以供报告之用。
请问我如何在 C# 中实现这一点。
{
"count": 6,
"value": [
{
"id": 1,
"workItemId": 226,
"rev": 1,
"revisedBy": {
"id": "0e7735b9-cf6a-6468-82c1-81e6b092addd",
"descriptor": "aad.MGU3NzM1YjktY2Y2YS03NDY4LTgyYzEtODFlNmIwOTJhZGRk"
},
"revisedDate": "2020-05-22T09:49:00.81Z",
"fields": {
"System.Id": {
"newValue": 226
},
"System.Reason": {
"newValue": "New"
},
"System.CreatedDate": {
"newValue": "2020-05-22T07:59:22.64Z"
},
"System.ChangedDate": {
"newValue": "2020-05-22T07:59:22.64Z"
}
}
},
{
"id": 2,
"workItemId": 226,
"rev": 2,
"revisedDate": "2020-05-22T09:49:04.45Z",
"fields": {
"System.Rev": {
"oldValue": 1,
"newValue": 2
},
"System.State":{
"oldValue":"New",
"newValue":"Resolved"
}
}
}
]
}
您可以创建一个 JArray 对象,然后循环执行任何您想做的事情:
var values = (JArray)jObject["value"]; //jObject is your json passed in parameter
var items = values.Select(x => new Item
{
Id= x["id"]?.Value<int>(),
...
Fields = new Fields
{
State = new State
{
x["fields"]?["System.State"]?["newValue"]?.Value<string>(),
...
}
}
});
然后你就可以随心所欲地操作它了。
就像我们谈论评论一样,
你需要反序列化你的 json
private void btnConvert_Click(object sender, EventArgs e)
{
string fileName = "YOUR_PATH\test.json";
string jsonString = File.ReadAllText(fileName);
Root2 l = JsonConvert.DeserializeObject<Root2>(jsonString);
tbResult.Text = "l.value[1].fields.SystemState.newValue.ToString()- \n" + l.value[1].fields.SystemState.newValue.ToString();
foreach (var item in l.value)
{
if (item.fields.SystemState != null)
{
if (item.fields.SystemState.newValue == "Resolved")
MessageBox.Show("ID - " + item.id);
//ADD HERE THE LOGIC YOU NEED TO UPDATE BY THE ID THE COUNTER
}
}
}
您需要使用此 类 来创建对象 l,就像我的示例一样。
public class RevisedBy
{
public string id { get; set; }
public string descriptor { get; set; }
}
public class SystemId
{
public int newValue { get; set; }
}
public class SystemReason
{
public string newValue { get; set; }
}
public class SystemCreatedDate
{
public DateTime newValue { get; set; }
}
public class SystemChangedDate
{
public DateTime newValue { get; set; }
}
public class SystemRev
{
public int oldValue { get; set; }
public int newValue { get; set; }
}
public class SystemState
{
public string oldValue { get; set; }
public string newValue { get; set; }
}
public class Fields
{
[JsonProperty("System.Id")]
public SystemId SystemId { get; set; }
[JsonProperty("System.Reason")]
public SystemReason SystemReason { get; set; }
[JsonProperty("System.CreatedDate")]
public SystemCreatedDate SystemCreatedDate { get; set; }
[JsonProperty("System.ChangedDate")]
public SystemChangedDate SystemChangedDate { get; set; }
[JsonProperty("System.Rev")]
public SystemRev SystemRev { get; set; }
[JsonProperty("System.State")]
public SystemState SystemState { get; set; }
}
public class Value
{
public int id { get; set; }
public int workItemId { get; set; }
public int rev { get; set; }
public RevisedBy revisedBy { get; set; }
public DateTime revisedDate { get; set; }
public Fields fields { get; set; }
}
public class Root2
{
public int count { get; set; }
public List<Value> value { get; set; }
}
结果:
试试这个
var jp= JObject.Parse(json)["value"];
var count=0;
foreach (var item in jp)
{
var systemState = ((JObject) ((JObject)item).Properties()
.FirstOrDefault(p=>p.Name=="fields").Value).Properties()
.Where(v => v.Name == "System.State")
.Select(v=>v.Value).FirstOrDefault();
if ( systemState!=null
&& (string) systemState["oldValue"] != (string) systemState["newValue"]) count++;
}
结果
count=1
我以下面的 JSON 响应为例,我需要存储 System.State 从 x 变为 y 的次数。最终结果会将日期存储在文件中以供报告之用。
请问我如何在 C# 中实现这一点。
{
"count": 6,
"value": [
{
"id": 1,
"workItemId": 226,
"rev": 1,
"revisedBy": {
"id": "0e7735b9-cf6a-6468-82c1-81e6b092addd",
"descriptor": "aad.MGU3NzM1YjktY2Y2YS03NDY4LTgyYzEtODFlNmIwOTJhZGRk"
},
"revisedDate": "2020-05-22T09:49:00.81Z",
"fields": {
"System.Id": {
"newValue": 226
},
"System.Reason": {
"newValue": "New"
},
"System.CreatedDate": {
"newValue": "2020-05-22T07:59:22.64Z"
},
"System.ChangedDate": {
"newValue": "2020-05-22T07:59:22.64Z"
}
}
},
{
"id": 2,
"workItemId": 226,
"rev": 2,
"revisedDate": "2020-05-22T09:49:04.45Z",
"fields": {
"System.Rev": {
"oldValue": 1,
"newValue": 2
},
"System.State":{
"oldValue":"New",
"newValue":"Resolved"
}
}
}
]
}
您可以创建一个 JArray 对象,然后循环执行任何您想做的事情:
var values = (JArray)jObject["value"]; //jObject is your json passed in parameter
var items = values.Select(x => new Item
{
Id= x["id"]?.Value<int>(),
...
Fields = new Fields
{
State = new State
{
x["fields"]?["System.State"]?["newValue"]?.Value<string>(),
...
}
}
});
然后你就可以随心所欲地操作它了。
就像我们谈论评论一样, 你需要反序列化你的 json
private void btnConvert_Click(object sender, EventArgs e)
{
string fileName = "YOUR_PATH\test.json";
string jsonString = File.ReadAllText(fileName);
Root2 l = JsonConvert.DeserializeObject<Root2>(jsonString);
tbResult.Text = "l.value[1].fields.SystemState.newValue.ToString()- \n" + l.value[1].fields.SystemState.newValue.ToString();
foreach (var item in l.value)
{
if (item.fields.SystemState != null)
{
if (item.fields.SystemState.newValue == "Resolved")
MessageBox.Show("ID - " + item.id);
//ADD HERE THE LOGIC YOU NEED TO UPDATE BY THE ID THE COUNTER
}
}
}
您需要使用此 类 来创建对象 l,就像我的示例一样。
public class RevisedBy
{
public string id { get; set; }
public string descriptor { get; set; }
}
public class SystemId
{
public int newValue { get; set; }
}
public class SystemReason
{
public string newValue { get; set; }
}
public class SystemCreatedDate
{
public DateTime newValue { get; set; }
}
public class SystemChangedDate
{
public DateTime newValue { get; set; }
}
public class SystemRev
{
public int oldValue { get; set; }
public int newValue { get; set; }
}
public class SystemState
{
public string oldValue { get; set; }
public string newValue { get; set; }
}
public class Fields
{
[JsonProperty("System.Id")]
public SystemId SystemId { get; set; }
[JsonProperty("System.Reason")]
public SystemReason SystemReason { get; set; }
[JsonProperty("System.CreatedDate")]
public SystemCreatedDate SystemCreatedDate { get; set; }
[JsonProperty("System.ChangedDate")]
public SystemChangedDate SystemChangedDate { get; set; }
[JsonProperty("System.Rev")]
public SystemRev SystemRev { get; set; }
[JsonProperty("System.State")]
public SystemState SystemState { get; set; }
}
public class Value
{
public int id { get; set; }
public int workItemId { get; set; }
public int rev { get; set; }
public RevisedBy revisedBy { get; set; }
public DateTime revisedDate { get; set; }
public Fields fields { get; set; }
}
public class Root2
{
public int count { get; set; }
public List<Value> value { get; set; }
}
结果:
试试这个
var jp= JObject.Parse(json)["value"];
var count=0;
foreach (var item in jp)
{
var systemState = ((JObject) ((JObject)item).Properties()
.FirstOrDefault(p=>p.Name=="fields").Value).Properties()
.Where(v => v.Name == "System.State")
.Select(v=>v.Value).FirstOrDefault();
if ( systemState!=null
&& (string) systemState["oldValue"] != (string) systemState["newValue"]) count++;
}
结果
count=1