筛选已解析的JSON对象

时间:2019-03-26 07:25:38

标签: c# .net 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"
            }
        },
    ]
}

我使用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

2 个答案:

答案 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(); 将解决此问题。