2015-03-31 3 views
2

У меня есть этот специфический ответ JSON, который я пытаюсь десериализовать без успеха. Я надеюсь, что кто-то может мне помочь.Deserializing ответ JSON на C#

Вот ответ JSON я получаю:

{ 
"num_locations": 1, 
"locations": { 
    "98765": { 
     "street1": "123 Fake Street", 
     "street2": "", 
     "city": "Lawrence", 
     "state": "Kansas", 
     "postal_code": "66044", 
     "s_status": "20", 
     "system_state": "Off" 
    } 
} 

}

Я использовал json2csharp http://json2csharp.com и получил эти рекомендуемые классы:

public class __invalid_type__98765 
    { 
     public string street1 { get; set; } 
     public string street2 { get; set; } 
     public string city { get; set; } 
     public string state { get; set; } 
     public string postal_code { get; set; } 
     public string s_status { get; set; } 
     public string system_state { get; set; } 
    } 

    public class Locations 
    { 
     public __invalid_type__98765 __invalid_name__98765 { get; set; } 
    } 

    public class RootObject 
    { 
     public int num_locations { get; set; } 
     public Locations locations { get; set; } 
    } 

Но когда я пытаюсь использовать его в моем код:

var locationResponse = JsonConvert.DeserializeObject<RootObject>(response.Content); 

Что я получаю (часы):

locationResponse : {RestSharpConsoleApplication.Program.RootObject} : RestSharpConsoleApplication.Program.RootObject 
locations : {RestSharpConsoleApplication.Program.Locations} : RestSharpConsoleApplication.Program.Locations 
__invalid_name__98765 : null : RestSharpConsoleApplication.Program.__invalid_type__98765 
num_locations : 1 : int 

Очевидно я не создаю (json2csharp) правые классы для DeserializeObject, и, к сожалению, я не имею никакого контроля над ответом JSON (поставщик = SimpliSafe).

Очевидно, что «98765» означает значение (номер места), но json2csharp делает его в этом классе __invalid_type__98765, и, вероятно, поэтому он получает значение null.

Любая идея, как классы должны искать, чтобы этот конкретный JSON был успешно десериализован?

Спасибо! Zachs

ответ

3

Вы должны быть в состоянии сделать это с помощью словаря:

public class MyData{ 
    [JsonProperty("locations")] 
    public Dictionary<string, Location> Locations {get;set;} 
} 
public class Location 
{ 
    public string street1 { get; set; } 
    public string street2 { get; set; } 
    public string city { get; set; } 
    public string state { get; set; } 
    public string postal_code { get; set; } 
    public string s_status { get; set; } 
    public string system_state { get; set; } 
} 
+0

спасибо! –

-2

У вас есть версия без экспресс Visual Studio? Если это так, скопируйте JSON в буфер обмена, а затем перейдите в меню Visual Studio: Edit >> Paste special >> Вставьте JSON в качестве классов.

Используя это дает:

public class Rootobject { 
    public int num_locations { get; set; } 
    public Locations locations { get; set; } 
} 

public class Locations { 
    public _98765 _98765 { get; set; } 
} 

public class _98765 { 
    public string street1 { get; set; } 
    public string street2 { get; set; } 
    public string city { get; set; } 
    public string state { get; set; } 
    public string postal_code { get; set; } 
    public string s_status { get; set; } 
    public string system_state { get; set; } 
} 

Это предполагает, ваша структура JSON не совсем верно.

+0

Это (кроме имени класса '_98765'), точно такое же, как структура классов OPs, сгенерированная json2csharp. JSON в порядке, но это всего лишь один пример из «схемы» JSON, который мы должны сделать с использованием некоторого здравого смысла (т. Е. Отметив, что может быть несколько местоположений и что значение «98765» является всего лишь значением идентификатора связанных с одним из них). – Alex

+0

Я не уверен, какую точку вы пытаетесь сделать, но nvm. – Ulric

-2

Вы также можете указать имя свойства с помощью атрибута использовать, чтобы обойти эту проблему:

public class RootObject 
{ 
    public int num_locations { get; set; } 
    public Locations locations { get; set; } 
} 

public class Locations 
{ 
    [JsonProperty("98765")] 
    public LocationInner Inner { get; set; } 
} 

public class LocationInner 
{ 
    public string street1 { get; set; } 
    public string street2 { get; set; } 
    public string city { get; set; } 
    public string state { get; set; } 
    public string postal_code { get; set; } 
    public string s_status { get; set; } 
    public string system_state { get; set; } 
} 

... но это действительно было бы лучше, если бы JSON был отформатирован, так что МЕСТОПОЛОЖЕНИЕ было на самом деле массив объектов местоположения.

Смежные вопросы