使用 C# 在 Jira-Rest-Api 中搜索过滤器
Searching for Filter in Jira-Rest-Api with C#
我正在尝试使用 c# HttpWebRequest 和 Rest-Api 从实际用户中搜索所有最喜欢的过滤器 (JIRA)。我仍然可以阅读问题,但过滤器不起作用。
阅读问题的工作方式如下:
例如,我有这个 URL 从项目 IT 中获取所有问题:
http://jira-test.myServer.de/rest/api/2/search?jql=project=%22IT%22
我正在使用 DataContractJsonSerializer
交换对 C#-Objects 的 JSON 响应。
由此class我在序列化后得到一个对象:
[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#-Class 是问题所在,因为 JSON 看起来不错并且我的浏览器提供了正确的输出。
如果我理解正确,你的问题是结果包含一个 "Filter" 对象数组,但你想将其反序列化为包含该数组的简单对象。所以你只需要将流反序列化为 FilterKopf[]
而不是 FilterData
.
我根据 this 的回答创建了一个简单的请求(我稍微修改了一下,例如不是 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);
}
让我们看看这是做什么的。
我正在尝试使用 c# HttpWebRequest 和 Rest-Api 从实际用户中搜索所有最喜欢的过滤器 (JIRA)。我仍然可以阅读问题,但过滤器不起作用。
阅读问题的工作方式如下:
例如,我有这个 URL 从项目 IT 中获取所有问题:
http://jira-test.myServer.de/rest/api/2/search?jql=project=%22IT%22
我正在使用 DataContractJsonSerializer
交换对 C#-Objects 的 JSON 响应。
由此class我在序列化后得到一个对象:
[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#-Class 是问题所在,因为 JSON 看起来不错并且我的浏览器提供了正确的输出。
如果我理解正确,你的问题是结果包含一个 "Filter" 对象数组,但你想将其反序列化为包含该数组的简单对象。所以你只需要将流反序列化为 FilterKopf[]
而不是 FilterData
.
我根据 this 的回答创建了一个简单的请求(我稍微修改了一下,例如不是 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);
}
让我们看看这是做什么的。