简体   繁体   中英

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();
        }

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://docs.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

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);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM