我正在进行电话呼叫并接收以下JSON响应:
{
"issues": [{
"id": "250271",
"self": "KeyUrl1",
"key": "Key-8622",
"fields": {
"attachment": [{
"self": "AttachmentUrl1",
"id": "106198",
"filename": "export.htm"
}
],
"customfield_11041": "Test"
}
},
{
"id": "250272",
"self": "KeyUrl2",
"key": "Key-8621",
"fields": {
"attachment": [{
"self": "AttachmentUrl2",
"id": "106199",
"filename": "lmn.htm"
}
],
"customfield_11041": "Test"
}
},
]
}
我使用NewtonSoft Json将其解析为JObject。
var jObject = JObject.Parse(response);
此外,我尝试过滤掉缺少附件或附件中没有文件名(如“导出”)的记录。
以下是我编写的代码,理想情况下,它应该在records对象中仅产生1条记录,但是它将返回两个对象。
var issues = jObject["issues"] as JArray;
var records = issues.Where(x => !x["fields"]["attachment"].Any() || !x["fields"]["attachment"].Any(y => y["filename"].Contains("export")));
需要帮助以找出问题所在。
这里是小提琴链接-https://dotnetfiddle.net/AVyIHr
答案 0 :(得分:10)
问题是您要对Contains("export")
的结果调用y["filename"]
,它不是字符串,而是JToken
。您需要先转换为字符串,然后才能使用所需的Contains
形式。
此外,您可以摆脱第一个条件-带有 no 附件的问题始终没有带有“导出”文件名的附件。
这就是这个:
var records = issues
.Where(x => !x["fields"]["attachment"].Any(y => ((string) y["filename"]).Contains("export")))
.ToList();
您可能会发现反序列化为一个类更简单,但是,这将减少错字的风险和这种转换错误的风险。如果您反序列化为List<Issue>
,则将具有以下条件:
x => !x.Fields.Attachments.Any(y => y.Filename.Contains("export"))
...我认为比较干净。
答案 1 :(得分:1)
port number 8080
添加var records = issues.Where(x => !x["fields"]["attachment"].Any() || !x["fields"]["attachment"].Any(y => y["filename"].ToString().Contains("export"))).ToList();
将解决此问题。