筛选已解析的JSON对象

Nil*_*rai 2 .net c# json

我正在拨打电话,并收到以下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"
            }
        },
    ]
}
Run Code Online (Sandbox Code Playgroud)

我使用NewtonSoft Json将其解析为JObject。

var jObject = JObject.Parse(response);
Run Code Online (Sandbox Code Playgroud)

此外,我正在尝试过滤掉缺少附件或没有附件包含“导出”之类文件名的记录。

以下是我编写的代码,理想情况下,它应该在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")));
Run Code Online (Sandbox Code Playgroud)

需要帮助找出问题所在。

这是小提琴链接-https: //dotnetfiddle.net/AVyIHr

Jon*_*eet 10

问题是您要调用Contains("export")的结果y["filename"]不是字符串,而是一个字符串JToken。您需要先转换为字符串,然后才能使用所需的格式Contains

此外,您可以摆脱第一个条件- 没有附件的问题也不会包含任何带有“导出”文件名的附件。

剩下的就是:

var records = issues
    .Where(x => !x["fields"]["attachment"].Any(y => ((string) y["filename"]).Contains("export")))
    .ToList();
Run Code Online (Sandbox Code Playgroud)

你可能会发现它更简单反序列化的一类,但是-这将减少错别字的风险这种转换错误的风险。如果反序列化为a,则将List<Issue>具有以下条件:

x => !x.Fields.Attachments.Any(y => y.Filename.Contains("export"))
Run Code Online (Sandbox Code Playgroud)

...我认为比较干净。