2017-02-16 4 views
1

Я автоматизирую API. Я хотел бы десериализовать ответ JSON, который я получаю, но я не могу понять, как это сделать. Это JSON я получаю в ответ:Результат десериализации JSON

{ 
    "class": [ 
    "Paged-Collection", 
    "Products" 
    ], 

    "properties": { 
    "defaultPageSize": 10, 
    "skip": null, 
    "top": 10, 
    "totalRows": 2 
    }, 

    "entities": [ 
    { 
     "class": [ 
     "Product" 
     ], 
     "rel": [], 
     "properties": { 
     "Supplier": "Supplier1", 
     "Currency": "USD", 
     "ProductCode": "SomeCode1", 
     "price": 2 
     } 
    }, 
    { 
     "class": [ 
     "Product" 
     ], 
     "rel": [], 
     "properties": { 
     "Supplier": "Supplier2", 
     "Currency": "USD", 
     "ProductCode": "SomeCode2", 
     "price": 73 
     } 
    }, 
    ], 
    "links": [ 
    { 
     "rel": [ 
     "self" 
     ], 
     "href": "http://localhost...", 
     "method": "GET", 
     "title": null, 
     "type": null 
    } 
    ] 
} 

от того, что я видел в других примерах десериализации сводится к выяснению точного strucutre данных (не уверен, хотя, если это то, что это такое), однако я сделал несколько попытки (а не просто бросаясь SO для ответа), так что это моя последняя попытка:

структуры, как я это вижу:

public class Data 
{ 
    List<string> @class { get; set; } 
    Dictionary<string, MetaData> properties { get; set; } 
    List<entities> entities { get; set; } 
    List<LinkFeed> links { get; set; } 
} 
public class MetaData 
{ 
    public int defaultPageSize { get; set; } 
    public string skip { get; set; } 
    public int top { get; set; } 
    public int totalRows { get; set; } 
} 
public class entities 
{ 
    public List<string> @class { get; set; } 
    public List<string> rel { get; set; } 
    public properties property { get; set; } 
} 

public class properties 
{ 
    public string Supplier { get; set; } 
    public string Currency { get; set; } 
    public string ProductCode { get; set; } 
    public string price { get; set; } 
    public double Price { get; set; } 
} 

public class LinkFeed 
{ 
    public List<string> rel { get; set; } 
    public string href { get; set; } 
    public string method { get; set; } 
    public string title { get; set; } 
    public string type { get; set; } 
} 

и фактическая десериализация с помощью Newtonsoft.Json:

var result = JsonConvert.DeserializeObject<Data>(data); 

И все Null ..

На самом деле данные, которые я действительно заинтересован в том, что под "entities", но я не знаю, если извлекая только то, что будет на самом деле проще или сложнее.

+0

что вы получаете как ответ? строка json, json-файл или json-объект? – LordNeo

+0

Объект, но @CodingYoshi alreday выяснил это – Leron

ответ

2

Это ваша структура:

public class Rootobject { 
    public string[] _class { get; set; } 
    public Properties properties { get; set; } 
    public Entity[] entities { get; set; } 
    public Link[] links { get; set; } 
} 

public class Properties { 
    public int defaultPageSize { get; set; } 
    public object skip { get; set; } 
    public int top { get; set; } 
    public int totalRows { get; set; } 
} 

public class Entity { 
    public string[] _class { get; set; } 
    public object[] rel { get; set; } 
    public Properties1 properties { get; set; } 
} 

public class Properties1 { 
    public string Supplier { get; set; } 
    public string Currency { get; set; } 
    public string ProductCode { get; set; } 
    public int price { get; set; } 
} 

public class Link { 
    public string[] rel { get; set; } 
    public string href { get; set; } 
    public string method { get; set; } 
    public object title { get; set; } 
    public object type { get; set; } 
} 

Таким образом, вы будете делать это:

var result = JsonConvert.DeserializeObject<Rootobject>(data); 

Я бы переименовать класс Properties на другое имя, потому что он будет конфликтовать с Properties класса сборки. Это даст вам головные боли, чтобы просто быть в безопасности, называя это чем-то другим.

Кроме того, если вам не нравится, некоторые из имен свойств в указанных выше классах, я имею в виду, я не люблю его, потому что не следует конвенции .NET именование, то вы можете сделать это:

public class Rootobject { 
    [JsonProperty("class")] 
    public string[] MyClass { get; set; } 

    // ... other properties 
} 

Очевидно, что его называть MyClass является просто примером, поэтому дайте ему имя, которое отражает бизнес-домен.

+0

Спасибо, работает как ожидалось. – Leron

+0

'JsonConvert.PopulateObject (данные, Rootobject);' тоже. – nelek

+0

Спасибо за советы. я уверен, что я изменю имена, 'class' и' property', конечно, не кажутся прекрасными, но я пытался максимально приблизить его к исходному именованию из 'JSON', но теперь, когда у меня есть рабочий прототип Я могу поиграть с ним! – Leron

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