2012-04-01 19 views
0

Ich bin neu in der Arbeit mit JSON - Ich arbeite mit einer bestehenden JSON-Datenstruktur und versucht, die Daten auszugeben, aber ein Teil der vorhandenen Datenstruktur hat mich ratlos.C# Deserialize Nested JSON

Hier finden Sie meine Json Daten:

{"supplier": 
    { 
    "supplierid":3590, 
    "code":"ENCLES", 
    "name":"Les Miserables", 
    "analyses":[], 
    "amenities":[], 
    "info": 
     "{\"Supplier\": 
      { 
      \"Name\":\"Les Miserables\", 
      \"LastUpdate\":\"2011-11-01T22:16:06Z\", 
      \"Address3\":\"London\", 
      \"Address2\":\"51 Shaftesbury Avenue\", 
      \"PostCode\":\"W1D 6BA\", 
      \"Address1\":\"Queen's Theatre\", 
      \"Address4\":\"\", 
      \"Address5\":\"\", 
      \"SupplierId\":3590, 
      \"SupplierCode\":\"ENCLES\" 
      } 
     }", 
     ... 
     } 

Das Bit, das mich ist die Info-Daten stapfte hat - es eine weitere verschachtelte JSON-String ist.

Meine Klasse ist:

public class TheatreListing 
{ 
    public supplier supplier; 
} 

public class supplier 
{ 
    public int? supplierid { get; set; } 
    public string code { get; set; } 
    public string name { get; set; } 
    public listingInfo info { get; set; } 
} 


public class listingInfo 
{ 
    public Address Supplier { get; set; } 

} 

public class Address 
{ 
    public string Address1 { get; set; } 
    public string Address2 { get; set; } 
    public string Address3 { get; set; } 
    public string Address4 { get; set; } 
    public string Address5 { get; set; } 
    public string PostCode { get; set; } 
} 

Mein Code, um zu versuchen und auf die Daten zugreifen ist:

TheatreListing tl = Json.Decode<TheatreListing>(json); 
StringBuilder sbb = new StringBuilder(); 
sbb.Append("Name = " + tl.supplier.name.ToString()); 
sbb.Append("<br />Supplier ID = " + tl.supplier.supplierid.ToString()); 
sbb.Append("<br />Code = " + tl.supplier.code.ToString()); 
sbb.Append("<br />Address = " + tl.supplier.info.Supplier.Address2.ToString()); 
litOutput.Text += sbb.ToString(); 

Die Fehlermeldung erhalte ich ist:

Cannot convert object of type 'System.String' to type 'listingInfo' 

Kann jemand bitte führe mich auf den Fehler meiner Wege hier?

Prost

Nigel

+0

Ich würde vorschlagen, das innere Zeug zu einem 'string' zu deserialisieren und dann das in einem 2. Durchlauf zum korrekten Typ zu deserialisieren. Es könnte möglich sein, einen benutzerdefinierten Converter zu registrieren, aber ... (im Idealfall wäre es nicht so hässlich verschachtelt: - /) –

+0

Es tut mir leid, sollte "info": "{\" Supplier \ ": ... nicht" info "sein: {\" Supplier \ ": (Klammer ohne vorangestelltes Zitat) und dasselbe für das Ende der Klammer? – mho

Antwort

0

Das Problem ist, innerhalb der Linie

TheatreListing tl = Json.Decode<TheatreListing>(json); 

Ich denke, die Umstellung auf TheatreListing für Ihre aktuelle json ausgefallen ist.

Warum versuchen Sie nicht mit JavascriptSerializer und sehen, ob es funktioniert oder nicht.

JavaScriptSerializer js = new JavaScriptSerializer(); 
TheatreListing tree = js.Deserialize <TheatreListing>(json); 
3

empfehle ich auf ein paar Dinge zu betrachten:

1) json2csharp Verwenden Sie Ihre C# -Klassen aus Ihrem bestehenden json json.net

2) Verwenden Sie zu generieren Ihre json deserialisieren, arbeitet wie ein Champion !