Reputation: 488
I am reffering my question to the Microsoft doc. I requested the azure devOps api to retrieve all repos hosted in a particular organization and project. The response is a json looking like following:
{
"count": 3,
"value": [
{
"id": "5febef5a-833d-4e14-b9c0-14cb638f91e6",
"name": "AnotherRepository",
"url": "https://dev.azure.com/fabrikam/_apis/git/repositories/5febef5a-833d-4e14-b9c0-14cb638f91e6",
"project": {
"id": "6ce954b1-ce1f-45d1-b94d-e6bf2464ba2c",
"name": "Fabrikam-Fiber-Git",
"url": "https://dev.azure.com/fabrikam/_apis/projects/6ce954b1-ce1f-45d1-b94d-e6bf2464ba2c",
"state": "wellFormed"
},
"remoteUrl": "https://dev.azure.com/fabrikam/Fabrikam-Fiber-Git/_git/AnotherRepository"
},
{
"id": "278d5cd2-584d-4b63-824a-2ba458937249",
"name": "Fabrikam-Fiber-Git",
"url": "https://dev.azure.com/fabrikam/_apis/git/repositories/278d5cd2-584d-4b63-824a-2ba458937249",
"project": {
"id": "6ce954b1-ce1f-45d1-b94d-e6bf2464ba2c",
"name": "Fabrikam-Fiber-Git",
"url": "https://dev.azure.com/fabrikam/_apis/projects/6ce954b1-ce1f-45d1-b94d-e6bf2464ba2c",
"state": "wellFormed"
},
"defaultBranch": "refs/heads/master",
"remoteUrl": "https://dev.azure.com/fabrikam/_git/Fabrikam-Fiber-Git"
},
{
"id": "66efb083-777a-4cac-a350-a24b046be6be",
"name": "TestGit",
"url": "https://dev.azure.com/fabrikam/_apis/git/repositories/66efb083-777a-4cac-a350-a24b046be6be",
"project": {
"id": "281f9a5b-af0d-49b4-a1df-fe6f5e5f84d0",
"name": "TestGit",
"url": "https://dev.azure.com/fabrikam/_apis/projects/281f9a5b-af0d-49b4-a1df-fe6f5e5f84d0",
"state": "wellFormed"
},
"defaultBranch": "refs/heads/master",
"remoteUrl": "https://dev.azure.com/fabrikam/_git/TestGit"
}
]
}
The Microsoft Doc says that the api returns type GitRepository[]
so I want to deserialize the json into that type but how can I do that??
Because of the count
and value
property I built a HelperClass like following:
public class Rootobject
{
public GitRepository[] value { get; set; }
public int count { get; set; }
}
But after the deserialization and cast into that object all the props of GitRepository
are null.
Can someone help me why all the properties are null??
EDIT: This is the deserialization
static async Task Main(string[] args)
{
string accessToken = "personal_access_token";
HttpClient httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(string.Format("{0}:{1}", string.Empty, accessToken))));
var response = await httpClient.GetStringAsync("https://dev.azure.com/fabrikam/_apis/git/repositories?api-version=5.1");
var responseObject = JsonSerializer.Deserialize<Rootobject>(response);
Console.WriteLine();
}
Upvotes: 1
Views: 1926
Reputation: 1539
The problem is that System.Text.Json.JsonSerializer
is by default case-sensitive. GitRepository
property names are PascalCase while your provided json example contains CamelCase names. So JsonSerializer can't deserialize those properties correctly.
You can override the default settings by providing JsonSerializerOptions
:
var responseObject = JsonSerializer.Deserialize<Rootobject>(response, new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true
});
Also I noticed that project
property is still not being deserialized. I guess it's because GitRepository
has a property called ProjectReference
(instead of Project
) and has a DataMember attribute.
It looks like System.Text.Json
doesn't respect the DataMember attribute. So I suggest you use Newtonsoft.Json
library. I tested it and it works fine:
var responseObject = Newtonsoft.Json.JsonConvert.DeserializeObject<Rootobject>(response);
Upvotes: 1
Reputation: 1613
How are you doing your deserialization? Where have you defined the GitRepository
class? Have you tried deserializing into string to check if any members have changed? The documentation is from 2016, and might have changed since.
You could instead use the nuget packages provided by Microsoft to access these APIs: https://learn.microsoft.com/en-us/azure/devops/integrate/concepts/dotnet-client-libraries?view=azure-devops
I think the NuGet package you need is Microsoft.TeamFoundationServer.Client
Upvotes: 2