2017-12-18 8 views
3

私はこのJSONを得た:ベストな方法 - C#

{ 
    "CountriesAndCities": [ 
     { 
      "CountryId": 2, 
      "CountryName": "Chile", 
      "CountryISOA3": "CHL", 
      "Cities": [ 
       { 
        "CityId": 26, 
        "CityName": "Gran Santiago", 
        "Country": null 
       }, 
       { 
        "CityId": 27, 
        "CityName": "Gran Concepción", 
        "Country": null 
       } 
      ] 
     } 
    ] 
} 

あなたが見ることができるように、それはオブジェクトのリストだし、それらのオブジェクトは、ネストされた別のリストを持っています。これは、トリックを行い、今

public class City 
    { 
     public int CityId { get; set; } 
     public string CityName { get; set; } 
     public Country Country { get; set; } 
    } 

    public class Country 
    { 
     public int CountryId { get; set; } 
     public string CountryName { get; set; } 
     public string CountryISOA3 { get; set; } 
     public ICollection<City> Cities { get; set; } 
    } 

が、私はこれらのモデルを持っている

public ICollection<Country> Countries { get; set; } 

     public RegionViewModel() 
     { 
      // Pidiendo las ciudades al backend. 
      S3EWebApi webApi = new S3EWebApi(); 
      HttpResponseMessage response = webApi.Get("/api/Benefits/GetCountriesAndCities"); 
      string jsonResponseString = response.Content.ReadAsStringAsync().Result; 
      JObject jsonResponse = JsonConvert.DeserializeObject<JObject>(jsonResponseString); 

      string countriesAndCitiesJSon = jsonResponse["CountriesAndCities"].ToString(); 
      Countries = JsonConvert.DeserializeObject<List<Country>>(countriesAndCitiesJSon); 
     } 

しかし、私は知らないが、私はそれがエレガントからあまりにも遠くな方法だと思います。 より良いアプローチがありますか?おかげさまで :)

+0

私はこれが重複していると確信しています。周囲を検索してみてください。 – visc

答えて

3

レスポンスのラッパークラスを作成します。

public class CountriesAndCitiesResponse 
{ 
    public List<Country> CountriesAndCities { get; set; } 
} 

そして、そのようにそれを使用します。

public RegionViewModel() 
{ 
    // Pidiendo las ciudades al backend. 
    S3EWebApi webApi = new S3EWebApi(); 
    HttpResponseMessage response = webApi.Get("/api/Benefits/GetCountriesAndCities"); 
    string jsonResponseString = response.Content.ReadAsStringAsync().Result; 
    CountriesAndCitiesResponse response = JsonConvert.DeserializeObject<CountriesAndCitiesResponse>(jsonResponseString); 

    Countries = response.CountriesAndCities; 
} 

はまた、あなたは再考える(それがデッドロックにつながる可能性)コンストラクタでasyncメソッドを呼び出す必要があります。代わりにasync Task Load()メソッドで呼び出しを行い、コンストラクターを呼び出した後に呼び出すことを検討することもできます。

1

一般的に言えば、2回逆直列化する必要はありません。最も簡単な解決策は、JSONの最も外側の部分を表現するようにクラスを作成し、@Alex Wiese's answerのように逆シリアル化することです。

ルートクラスなしでデシリアライズする場合は、JObjectにデシリアライズした後にToObject<T>()メソッドを使用できます。

JObject jsonResponse = JsonConvert.DeserializeObject<JObject>(jsonResponseString); 
Countries = jsonResponse["CountriesAndCities"].ToObject<List<Country>>(); 
関連する問題