用c#在Jira-Rest-Api中搜索过滤器

本文关键字:搜索 过滤器 Jira-Rest-Api | 更新日期: 2023-09-27 18:11:14

我试图使用c# HttpWebRequest和Rest-Api从实际用户搜索所有最喜欢的过滤器(JIRA)。我仍然可以读取问题,但过滤器不起作用。

Reading Issues的工作原理如下:

例如,我有这个URL来获取项目IT的所有问题:

http://jira-test.myServer.de/rest/api/2/search?jql=project=%22IT%22

我使用DataContractJsonSerializer来交换JSON响应到c# -Objects。

从这个类我得到一个对象后序列化:

[DataContract]
internal class Kopf
{
    [DataMember]
    public string startAt = string.Empty;
    [DataMember]
    public string maxResults = string.Empty;
    [DataMember]
    public string total = string.Empty;
    [DataMember]
    public Issues[] issues = null;
}

JSON的第一行看起来像这样:

{"expand":"schema,names","startAt":0,"maxResults":50,"total":23044,"issues":[{"expand":"operations,editmeta,changelog,transitions,renderedFields","id":"40000","self":"http://jira-test.myServer.de/rest/api/2/issue/40000","key":"IT-23237","fields":

所以我不明白为什么以下内容对我不起作用:这个URL在浏览器中给我正确的JSON:

http://jira-test.myServer.de/rest/api/2/filter/favourite

JSON的第一行:

[{"self":"http://jira-test.myServer.de/rest/api/2/filter/10119","id":"10119","name":"Aktiv","description":"Alle Aufgaben die gerade aktiv von mir bearbeitet werden.","owner":{"self":"http://jira-test.myServer.de/rest/api/2/user?username=sb9923","key":"sb9923","name":"sb9923","avatarUrls":{"16x16":"http://jira-test.myServer.de/secure/useravatar?

这是我要序列化的对象

[DataContract]
internal class FilterData
{
    [DataMember]
    public FilterKopf[] filter = null;
}
[DataContract]
internal class FilterKopf
{
    [DataMember]
    public string id = string.Empty;
    [DataMember]
    public string name = string.Empty;
    [DataMember]
    public string description = string.Empty;
    [DataMember]
    public string jql = string.Empty;
}

我没有得到任何异常或其他东西,但FilterData-Object中的FilterKopf数组始终为空。

我希望有人能帮我解决这个问题。我认为我的c#类是问题,因为JSON看起来很好,我的浏览器给出了正确的输出。

用c#在Jira-Rest-Api中搜索过滤器

如果我理解正确,您的问题是结果包含一个"过滤器"对象数组,但您想将其反序列化为包含该数组的简单对象。因此,您所需要做的就是将流反序列化为FilterKopf[]而不是FilterData

我根据这个答案创建了一个简单的请求(我稍微修改了一下,例如不是POST而是GET)

public class JiraTest
{
    internal IEnumerable<FilterKopf> GetFavouriteFilters()
    {
        string url = "http://jira-test.myserver.de/rest/api/2/filter/favourite";
        var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
        httpWebRequest.ContentType = "application/json";
        httpWebRequest.Method = "GET";
        httpWebRequest.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes("YOUR_USERNAME:YOUR_PASSWORD"));
        var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(FilterKopf[]));
        var filterKoepfe = (FilterKopf[])serializer.ReadObject(httpResponse.GetResponseStream());
        return filterKoepfe;
    }
}
[DataContract]
internal class FilterKopf
{
    [DataMember]
    public string id = string.Empty;
    [DataMember]
    public string name = string.Empty;
    [DataMember]
    public string description = string.Empty;
    [DataMember]
    public string jql = string.Empty;
}

使用我自己的帐户和访问我们的Jira服务器,结果确实反映了我最喜欢的过滤器。

作为第二次机会,尝试使用Json。. NET而不是DataContractJsonSerializer。通过NuGet添加到项目中,并将反序列化的两行替换为:

FilterKopf[] filterKoepfe = null;
using (Stream stream = httpResponse.GetResponseStream())
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
    string jsonResponse = reader.ReadToEnd();
    filterKoepfe = Newtonsoft.Json.JsonConvert.DeserializeObject<FilterKopf[]>(jsonResponse);
}