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

Posted

技术标签:

【中文标题】无法使用 c# 根据来自 json 的 json 元素属性值验证数据条件【英文标题】:Not able validate data condition based on the json element attribute value from a json using c# 【发布时间】:2020-09-22 12:27:04 【问题描述】:

我有一个 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 的行为,因此我的数据通过了。请在这里指导我。我对 C# 非常陌生。

【问题讨论】:

【参考方案1】:

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

如果你有双键,你的解析器会采用最后一个值而不是第一个值。

首先应该更正您的 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
        
    

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

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

【讨论】:

您好先生,我已经更正了 json,在删除示例数据的更多属性时我错过了,感谢您的宝贵时间,我已经浏览了您的帖子,目前 json 文件来自不同的系统,在我收到实际的 json 文件之前,json 文件也是从 xml 生成的。所以我得到了文件,我发布它的方式。在这种情况下你如何建议我。 据我所知这是不可能的,你不能用魔法解决不一致的数据结构。您的 xml 错误或以错误的方式转换为 json。唯一的解决方案是找出您的不同 json 的模式并编写一个自定义解析器来解决您正在寻找的内容。看看这个***.com/questions/42384565/… 和这个***.com/questions/20714160/…

以上是关于无法使用 c# 根据来自 json 的 json 元素属性值验证数据条件的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中针对 XSD 模式验证 json 数据

C# Rest 服务 - 无法在服务方法中接收 JSON 请求

在 c# 中使用 linq 按钮无法从 json 中正确计算章节 ID

使用 C# 在数据库中显示来自 json 文件的数据

C# 反序列化 JSON Schema.org 来自网络的食谱

无法解析 Reddit Json [重复]