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

问题描述 投票:0回答:1

我有一个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; }
}

当我尝试在第二个条件中进行分析时,message.PLMXML.Operation.id的值始终为id28,因为条件失败的秒数。通过第一个if条件时,只有一个message.PLMXML.OperationRevision.id。我想要的行为是,它将检查完整的json数据并检查是否存在具有值id21的message.PLMXML.Operation.id,因此我的数据被传递了。请在这里指导我。我对C#还是陌生的。

c# .net nuget-package .net-framework-version jsonserializer
1个回答
0
投票

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

发生什么情况,您有双键,并且解析器采用最后一个值而不是第一个值。

首先应更正您的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您的json并使用此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
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.