C# 用C语言在jirarestapi中搜索过滤器#

C# 用C语言在jirarestapi中搜索过滤器#,c#,jira,jira-rest-api,C#,Jira,Jira Rest Api,我试图使用c#HttpWebRequest和RESTAPI从实际用户中搜索所有收藏夹过滤器(JIRA)。我仍然能够阅读问题,但过滤器不工作 阅读问题的工作如下: 例如,我使用此URL从project IT获取所有问题: http://jira-test.myServer.de/rest/api/2/search?jql=project=%22IT%22 我正在使用DataContractJsonSerializer将JSON响应交换到C#对象 从该类中,我将在序列化后获得一个对象: [Data

我试图使用c#HttpWebRequest和RESTAPI从实际用户中搜索所有收藏夹过滤器(JIRA)。我仍然能够阅读问题,但过滤器不工作

阅读问题的工作如下:

例如,我使用此URL从project IT获取所有问题:

http://jira-test.myServer.de/rest/api/2/search?jql=project=%22IT%22
我正在使用
DataContractJsonSerializer
将JSON响应交换到C#对象

从该类中,我将在序列化后获得一个对象:

[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对象中的FilterKopf数组总是空的


我希望有人能帮我。我认为我的C#-类是个问题,因为JSON看起来很好,我的浏览器提供了正确的输出。

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

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

公共类JiraTest
{
内部IEnumerable GetFavoriteFilters()
{
字符串url=”http://jira-test.myserver.de/rest/api/2/filter/favourite";
var httpWebRequest=(httpWebRequest)WebRequest.Create(url);
httpWebRequest.ContentType=“应用程序/json”;
httpWebRequest.Method=“GET”;
httpWebRequest.Headers[“Authorization”]=“Basic”+Convert.ToBase64String(Encoding.Default.GetBytes(“您的用户名:您的密码”);
var httpResponse=(HttpWebResponse)httpWebRequest.GetResponse();
DataContractJsonSerializer=新的DataContractJsonSerializer(typeof(FilterKopf[]);
var filterKoepfe=(FilterKopf[])serializer.ReadObject(httpResponse.GetResponseStream());
返回过滤器Koepfe;
}
}
[数据合同]
内部类过滤器KOPF
{
[数据成员]
公共字符串id=string.Empty;
[数据成员]
公共字符串名称=string.Empty;
[数据成员]
公共字符串描述=string.Empty;
[数据成员]
公共字符串jql=string.Empty;
}
通过我自己的帐户和对Jira服务器的访问,结果确实反映了我最喜欢的过滤器

更新

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

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);
}
FilterKopf[]filterKoepfe=null;
使用(Stream-Stream=httpResponse.GetResponseStream())
使用(StreamReader=newstreamreader(stream,Encoding.UTF8))
{
字符串jsonResponse=reader.ReadToEnd();
filterKoepfe=Newtonsoft.Json.JsonConvert.DeserializeObject(jsonResponse);
}

让我们看看这是怎么做的。

我认为问题在于问题数组以名为issues:[{的方式启动,但筛选器响应是在一个数组中启动的,而该数组以前没有声明过[{self.我不知道如何在C#中使用它。嘿,谢谢你的回答。我复制了你的示例,它似乎完全符合逻辑。但它对我不起作用。数组总是空的(不是空的)。如果我在浏览器中使用url,我会得到一些过滤器,而且似乎一切都正常。我不知道:(您是否尝试像在单独的控制台应用程序中一样使用此代码?也不起作用?是的,我现在尝试在新的控制台应用程序中使用,但也不起作用。我只是得到一个空数组。在浏览器中,此url有很多点击率。读取问题没有问题。这很奇怪。还有一个想法:如果我使用http协议查询,我得到了一个空的非空数组。)y、 但是,我们的Jira服务器使用https协议。如果我切换到https,查询将返回实际结果。但我认为这不是您的问题,因为项目查询使用http。我添加了另一个可能的选项
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);
}