使用数组和对象遍历 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