Как я могу десериализовать ответ json на azure devOps? - PullRequest
0 голосов
/ 04 августа 2020

Я пересылаю свой вопрос на Microsoft do c. Я запросил azure devOps api для получения всех репозиториев, размещенных в конкретной организации и проекте. Ответ json выглядит следующим образом:

{
  "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"
    }
  ]
}

Microsoft Do c говорит, что api возвращает тип GitRepository[], поэтому я хочу десериализовать json в этот тип, но как я могу это сделать ??

Из-за свойств count и value я создал HelperClass, как показано ниже:

public class Rootobject
{
    public GitRepository[] value { get; set; }
    public int count { get; set; }
}

Но после десериализации и приведения в этот объект все свойства GitRepository равны нулю.

Может ли кто-нибудь мне помочь, почему все свойства равны нулю ??

EDIT: это десериализация

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

Ответы [ 2 ]

2 голосов
/ 04 августа 2020

Как вы проводите десериализацию? Где вы определили класс GitRepository? Вы пробовали десериализацию в строку, чтобы проверить, не изменились ли какие-либо члены? Документация относится к 2016 году и с тех пор могла измениться.

Вместо этого вы можете использовать пакеты nuget, предоставленные Microsoft, для доступа к этим API: https://docs.microsoft.com/en-us/azure/devops/integrate/concepts/dotnet-client-libraries?view=azure-devops

Я думаю вам нужен пакет NuGet Microsoft.TeamFoundationServer.Client

1 голос
/ 04 августа 2020

Проблема в том, что System.Text.Json.JsonSerializer по умолчанию чувствительно к регистру. Имена свойств GitRepository - это PascalCase, тогда как предоставленный вами пример json содержит имена CamelCase. Итак, JsonSerializer не может правильно десериализовать эти свойства.

Вы можете переопределить настройки по умолчанию, указав JsonSerializerOptions:

var responseObject = JsonSerializer.Deserialize<Rootobject>(response, new JsonSerializerOptions
{
    PropertyNameCaseInsensitive = true
});

Также я заметил, что свойство project все еще не десериализуется . Я предполагаю, это потому, что GitRepository имеет свойство с именем ProjectReference (вместо Project) и атрибут DataMember.

Похоже, что System.Text.Json не уважает атрибут DataMember. Поэтому я предлагаю вам использовать библиотеку Newtonsoft.Json. Протестировал, работает нормально:

var responseObject = Newtonsoft.Json.JsonConvert.DeserializeObject<Rootobject>(response);
...