如何将以下JSON传递给C#补丁方法w或没有Javascript序列化程序

我正在开发一个程序来访问Visual Studio Team Services的REST API(是Visual Studio Online)。 我关注https://www.visualstudio.com/integrate/api/wit/work-items

我能够通过使用以下代码片段传递正确的ID来查询工作项:

var uri = new Uri("https://{instance}.visualstudio.com/DefaultCollection/_apis/wit/workitems/7?api-version=1.0"); GetWorkItem(uri); public static async void GetWorkItem(Uri uri) { try { var username = "my username"; var password = " my pass word"; using (HttpClient client = new HttpClient()) { client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/json")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String( ASCIIEncoding.ASCII.GetBytes( string.Format("{0}:{1}", username, password)))); using (HttpResponseMessage response = client.GetAsync(uri) .Result) { response.EnsureSuccessStatusCode(); string responseBody = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseBody); } Console.Read(); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); Console.Read(); } } 

它正确返回此处指定的JSON https://www.visualstudio.com/integrate/api/wit/work-items#GetalistofworkitemsByIDs

现在我正在尝试通过修改其标题来更新工作项。

https://www.visualstudio.com/integrate/api/wit/work-items#UpdateworkitemsUpdateafield

为此,我写了一个方法:

  public static async void UpdateWorkItemStatus(Uri requestUri, HttpContent iContent) { { var method = new HttpMethod("PATCH"); var request = new HttpRequestMessage(method, requestUri) { Content = iContent }; HttpResponseMessage response; try { using (HttpClient client = new HttpClient()) { var username = "my username"; var password = "my password"; client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String( ASCIIEncoding.ASCII.GetBytes( string.Format("{0}:{1}", username, password)))); response = await client.SendAsync(request); response.EnsureSuccessStatusCode(); Console.WriteLine(response); Console.Read(); } } catch (TaskCanceledException e) { Console.WriteLine("ERROR: " + e.ToString()); Console.Read(); } } } 

我通过传递我的json调用此方法:

  var uri = new Uri("https://{instance}.visualstudio.com/DefaultCollection/_apis/wit/workitems/7?api-version=1.0"); string json = new JavaScriptSerializer().Serialize(new { op="replace", path="fields/System.Title", value=" 123 New Title" }); HttpContent httpContent = new StringContent(json, Encoding.UTF8, "application/json-patch+json"); UpdateWorkItemStatus(uri, httpContent); 

这符合https://www.visualstudio.com/integrate/api/wit/work-items#Updateworkitems中的信息

他们没有任何代码示例,所以我使用JavascriptSerializer但这没有做任何事情。 代码运行但没有输出,我的工作项也没有编辑。 由于使用了JavascriptSerializer,我不确定它的格式是否不正确,但我之前使用过这个类并且它运行良好。

基本上我需要传递这个JSON:

 [ { "op": "replace", "path": "fields/System.Title", "value":"New Title" } ] 

即使不使用JS Serializer类,任何有关如何运行并以正确格式传递JSON的帮助都将受到赞赏。

最终的想法是将其转换为可在Unix上运行的解释脚本,如curl,Python或Perl。 任何指针或建议也将受到赞赏。

我通常直接传递内容字符串,它的工作原理如下:

 string json = "[{\"op\":\"replace\",\"path\":\"/fields/System.Title\",\"value\":\"Title\"}]"; 

您由JavaScriptSerializer生成的字符串json缺少“[”和“]”。

顺便说一句,使用您提供的代码,如果您在UpdateWorkItemStatus(uri,httpContent)之前运行GetWorkItem(uri),则自GetWorkItem()之后的应用程序退出时,UpdateWorkItemStatus()将不会运行。