2017-02-16 157 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(data,Rootobject);'也是。 – nelek

+0

感謝您的提示。我肯定會更改名稱,'class'和'property'肯定不太好,但我試圖儘可能地將其與'JSON'中的原始名稱保持接近,但現在我已經在工作原型我可以玩它! – Leron