2016-08-24 3 views
0

Я имею дело с API, который возвращает что-то вроде этого:Deserialising вложенные объекты с Json.NET

{"v1.ProjectList": 
    { 
     "self_link": { "href": "https://central-staged:8880/api/v1/projects", "methods": "GET" }, 
     "items": [], 
     "register": {"href": "https://central-staged:8880/api/v1/projects/register", "methods": "POST"}, 
     "max_active": {"href": "https://central-staged:8880/api/v1/projects/max-active", "methods": "GET"} 
    } 
} 

Я генерация кучи DTOS для размещения Десериализации из этой строки JSON.

namespace v1 
{ 
    public class Project 
    { 
     public rest_common.Link branches { get; set; } 
     public float coordinate_x { get; set; } 
     public float coordinate_y { get; set; } 
     public string description { get; set; } 
     public int id { get; set; } 
     public string location { get; set; } 
     public string name { get; set; } 
     public rest_common.Link publish_events { get; set; } 
     public rest_common.Link self_link { get; set; } 
     public rest_common.Link thumbnail { get; set; } 
     public System.Guid uuid { get; set; } 
    } 

    [JsonObject(Title = "v1.ProjectList")] 
    public class ProjectList 
    { 
     public List<Project> items { get; set; } 
     public rest_common.Link max_active { get; set; } 
     public rest_common.Link register { get; set; } 
     public rest_common.Link self_link { get; set; } 
    } 
} 

namespace rest_common 
{ 
    public class Link 
    { 
     public string href { get; set; } 
     public string methods { get; set; } 
    } 
} 

Этот код был сгенерирован из кода на стороне сервера, и я могу его модифицировать. Единственное, что я не могу изменить в это время, - это ответ JSON, возвращаемый сервером.

Я пытаюсь выяснить, как deserialise это:

class Program 
    { 
     static void Main(string[] args) 
     { 
      var jsonContent = "{\"v1.ProjectList\": {\"self_link\": {\"href\": \"https://something.com/getblah\", \"methods\": \"GET\"}, \"items\": [], \"register\": {\"href\": \"https://something.com/postblah\", \"methods\": \"POST\"}, \"max_active\": {\"href\": \"https://something.com/getblah2\", \"methods\": \"GET\"}}}"; 
      var projectList = JsonConvert.DeserializeObject<ProjectList>(jsonContent); 
      Console.ReadLine(); 
     } 
    } 

В настоящее время projectList является экземпляром соответствующего класса, но все его члены null.

+2

Вы должны вставить ноны маскирования примера JSON. – Aybe

ответ

2

Вы пытаетесь десериализовать объект, который содержит одно свойство с именем v1.ProjectList. Поэтому создать такой класс:

public class ProxyObject 
{ 
    [JsonPropertyAttribute("v1.ProjectList")] 
    public ProjectList ProjectList { get; set;} 
} 

.. А потом это работает:

var projectList = JsonConvert.DeserializeObject<ProxyObject>(jsonContent).ProjectList; 

Атрибут [JsonObject(Title = "v1.ProjectList")] ненужно.

0

В качестве альтернативы, , так как вы создаете новый экземпляр класса вы десериализация строки JSON из показывают, что:

var projectList = new (ProjectList)(JsonConvert.DeserializeObject<ProjectList>(jsonContent)); 
Смежные вопросы