C # Сложный процесс десериализации Json - PullRequest
0 голосов
/ 05 марта 2019

Мне не удалось создать рабочее решение с существующими ответами на вопросы.

Я успешно использую следующий класс c #

public class country
{
    public string country_id;
    public string country_name;
}

со следующим кодом.В результате получается список стран

List<country> countries = new List<country>();  
var streamTask = client.GetStreamAsync("https://xxx");
var serializer = new DataContractJsonSerializer(typeof(List<country>));
countries = serializer.ReadObject(await streamTask) as List<country>;

НО : теперь я изменил API и получил результат, в котором я понятия не имею, как создать класс для использования того же кода.

Это результат вызова API:

{
 "api":{
   "results": 2
   "countries":{
     "1":"Austria"
     "2":"Germany"
    }
  }
}

Это вложенный объект, и у "стран" даже нет имен свойств.

Как десериализовать эторезультат?

1 Ответ

0 голосов
/ 05 марта 2019

Для начала вам нужно изменить свои контракты на данные:

public class apiResults
{
    public int results;
    public countries countries;
}

public class apiResponse
{
    public apiResults api;
}

[DataContract]
public class countries
{
    [DataMember(Name="1")]
    public string Country1 {get; set;}
}

, а затем использовать его, как и раньше:

var serializer = new DataContractJsonSerializer(typeof(apiResponse));
var result = serializer.ReadObject(stream) as apiResponse;

Console.WriteLine(result.api.countries.Country1);

Проблема в том, что вы жестко задаете числодоступные страны.Лучшим способом будет десериализация вашего нового класса стран в массив.

Если вы можете использовать NewtonsoftJson - решение намного проще:

public class apiResults
{
    public int results;
    public Dictionary<int, string> countries { get; set; }
}

public class apiResponse
{
    public apiResults api;
}

и использование:

var result = JsonConvert.DeserializeObject<apiResponse>(responseAsString);
Console.WriteLine(result.api.countries[1]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...