2017-02-16 8 views
1

Ich automatisiere eine API. Ich möchte die JSON Antwort deserialize, die ich bekomme, aber ich kann nicht herausfinden, wie man es macht. Dies ist die JSON ich als Antwort erhalten:Deserialize Komplex JSON Ergebnis

{ 
    "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 
    } 
    ] 
} 

von dem, was ich in anderen Beispielen gesehen habe die Deserialisierung nach unten kocht (wenn auch nicht sicher, ob das, was es ist), die genauen Daten strucutre, herauszufinden, aber ich habe einig (rauschen nicht nur sO Antwort auf) versucht, so ist dies mein letzter Versuch:

die Struktur, wie ich es sehe:

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; } 
} 

Und die tatsächliche Deserialisierung mit Newtonsoft.Json:

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

Und alles ist Null ..

Eigentlich die Daten, die ich wirklich interessiert bin ist, dass unter "entities" aber ich weiß nicht, ob nur das Extrahieren tatsächlich einfacher sein wird, oder schwieriger.

+0

Was bekommen Sie als Antwort? eine JSON-Zeichenfolge, eine JSON-Datei oder ein JSON-Objekt? – LordNeo

+0

Objekt aber @CodingYoshi schon herausgefunden es – Leron

Antwort

2

Das ist Ihre Struktur:

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; } 
} 

So werden Sie dies tun:

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

ich die Klasse Properties auf einen anderen Namen umbenennen würde, weil es mit der Properties Klasse der Baugruppe kollidieren wird. Das wird dir Kopfschmerzen bereiten, nur um sicher zu sein, nenne es etwas anderes.

Auch wenn Sie nicht in den oben genannten Klassen einige der Eigenschaftsnamen mögen, ich meine, ich mag es nicht, weil es nicht .NET-Namenskonventionen folgen, dann können Sie dies tun:

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

    // ... other properties 
} 

Offensichtlich ist es nur ein Beispiel, es MyClass zu nennen, also geben Sie ihm einen Namen, der die Geschäftsdomäne widerspiegelt.

+0

Danke, funktioniert wie erwartet. – Leron

+0

'JsonConvert.PopulateObject (data, Rootobject);' auch. – nelek

+0

Danke für die Tipps. sicherlich werde ich die Namen ändern, 'class' und' property' scheinen sicherlich nicht gut zu sein, aber ich habe versucht, es so nah wie möglich an der ursprünglichen Benennung von 'JSON' zu halten, aber jetzt habe ich einen funktionierenden Prototyp Ich kann damit herumspielen! – Leron