Marcel Müller
Marcel Müller

Reputation: 488

How can I deserialize the json response of azure devOps?

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

Answers (2)

rytisk
rytisk

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

Sotiris Panopoulos
Sotiris Panopoulos

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

Related Questions