无法使用 c# 根据来自 json 的 json 元素属性值验证数据条件

Not able validate data condition based on the json element attribute value from a json using c#

我有一个 json 文件,我必须在其中根据另一个 json 元素属性值验证 json 属性元素值。但是如果有 json 个同名元素。它总是采用最后一个值,而不是完全解析 json 数据。请指导我。

样本下方json文件

    {
   "PLMXML":{
      "language":"en-us",
      "author":"Developer",
      "date":"2020-05-22",
      "traverseRootRefs":"#id6",
      "Operation":{
         "id":"id21",
         "subType":"BS4_BaOP",
         "catalogueId":"70700000209604"
         },
      "Operation":{
         "id":"id28",
         "subType":"BS4_BaOP",
         "catalogueId":"70700000209603"
         },
      "OperationRevision":{
         "id":"id6",
         "subType":"BS4_BaOPRevision",
         "masterRef":"#id21",
         "revision":"A1"
         }
      }
}

在我尝试使用的代码下方

public void Readjsonfile(string jsondata)
{   
    var message = JsonConvert.DeserializeObject<plmxmldatamodel>(jsondata);      

    if (String.Equals(message.PLMXML.traverseRootRefs.Substring(1), message.PLMXML.OperationRevision.id))
    {   
        Console.WriteLine("Condtion1");         
        if (String.Equals(message.PLMXML.OperationRevision.masterRef.Substring(1), message.PLMXML.Operation.id))
        {
            Console.WriteLine("Condition_2");
            //Do something based on the condtion
        }               
    }
}
public class Operation
{
    public string id { get; set; }
    public string subType { get; set; }
    public string catalogueId { get; set; }
}
public class OperationRevision
{
    public string id { get; set; }
    public string subType { get; set; }
    public string masterRef { get; set; }
}
public class PLMXML
{
    public string language { get; set; }
    public string author { get; set; }
    public string date { get; set; }
    public string traverseRootRefs { get; set; }            
    public Operation Operation { get; set; }
    public OperationRevision OperationRevision { get; set; }
}
public class plmxmldatamodel
{
    public PLMXML PLMXML { get; set; }
}

当我尝试在第二个 if 条件中对此进行调试时,message.PLMXML.Operation.id 的值始终为 id28 ,因此第二个 if 条件失败。当第一个 if 条件通过时,因为只有一个 message.PLMXML.OperationRevision.id。我想要的行为是检查完整的 json 数据并检查是否存在值为 id21 的 message.PLMXML.Operation.id ,所以我的数据被传递了。请指导我 here.I 我是 C# 的新手。

根据我的观察,您有几个问题。

发生了什么事你有双键,而你的解析器取最后一个值而不是第一个值。

首先你的 json 应该得到纠正。我假设您有权更改 json 并且操作应该是一个数组,如下所示:

{
   "PLMXML":{
      "language":"en-us",
      "author":"Developer",
      "date":"2020-05-22",
      "traverseRootRefs":"#id6",
      "Operations":[
         {
            "id":"id21",
            "subType":"BS4_BaOP",
            "catalogueId":"70700000209604"
         },
         {
            "id":"id28",
            "subType":"BS4_BaOP",
            "catalogueId":"70700000209603"
         }
      ],
      "OperationRevision":{
         "id":"id6",
         "subType":"BS4_BaOPRevision",
         "masterRef":"#id21",
         "revision":"A1"
      }
   }
}

阵列就位后,使用在线工具 validate your json and use this tool 创建模型。

你的模型将是这样的:

public partial class PlmxmlDataModel
{
    [JsonProperty("PLMXML")]
    public Plmxml Plmxml { get; set; }
}

public partial class Plmxml
{
    [JsonProperty("language")]
    public string Language { get; set; }

    [JsonProperty("author")]
    public string Author { get; set; }

    [JsonProperty("date")]
    public DateTimeOffset Date { get; set; }

    [JsonProperty("traverseRootRefs")]
    public string TraverseRootRefs { get; set; }

    [JsonProperty("Operations")]
    public Operation[] Operations { get; set; }

    [JsonProperty("OperationRevision")]
    public OperationRevision OperationRevision { get; set; }
}

public partial class OperationRevision
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("subType")]
    public string SubType { get; set; }

    [JsonProperty("masterRef")]
    public string MasterRef { get; set; }

    [JsonProperty("revision")]
    public string Revision { get; set; }
}

public partial class Operation
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("subType")]
    public string SubType { get; set; }

    [JsonProperty("catalogueId")]
    public string CatalogueId { get; set; }
}

你的方法是这样的:

public void Readjsonfile(string jsondata)
{
    var message = JsonConvert.DeserializeObject<PlmxmlDataModel>(jsondata);

    if (String.Equals(message.Plmxml.TraverseRootRefs.Substring(1), message.Plmxml.OperationRevision.Id))
    {
        Console.WriteLine("Condtion1");
        if (String.Equals(message.Plmxml.OperationRevision.MasterRef.Substring(1), message.Plmxml.Operations[0].Id))
        {
            Console.WriteLine("Condition_2");
            //Do something based on the condtion
        }
    }
}

现在在你的方法中,我正在寻找包含 id 28 的数组索引 0,但是如果你在任何数组中查找 id 28,那么你可以执行如下操作:

if (message.Plmxml.Operations.Any(e => e.Id == message.Plmxml.OperationRevision.MasterRef.Substring(1)))