无法使用 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# Rest 服务 - 无法在服务方法中接收 JSON 请求
在 c# 中使用 linq 按钮无法从 json 中正确计算章节 ID