2014-05-06 1 views
10

Ich habe ein JSON-Objekt, das mit einer langen Liste von Vorwahlen geliefert wird. Leider ist jeder Gebietscode der Objektname in einer Liste im Datenobjekt. Wie erstelle ich eine Klasse, mit der RestSharp den Inhalt deserialisieren kann?JSON mit dynamischen Objekten deserialisieren

Hier ist, wie meine Klasse sieht jetzt:

public class phaxioResponse 
{ 
    public string success { get; set; } 
    public string message { get; set; } 
    public List<areaCode> data { get; set; } 

    public class areaCode 
    { 
     public string city { get; set; } 
     public string state { get; set; } 
    } 
} 

Und hier ist der JSON Inhalt:

{ 
    success: true 
    message: "277 area codes available." 
    data: { 
     201: { 
      city: "Bayonne, Jersey City, Union City" 
      state: "New Jersey" 
     } 
     202: { 
      city: "Washington" 
     state: "District Of Columbia" 
     } [...] 
} 
+2

Das json ist allerlei verschmutzt werden. –

+0

Und erwarten Sie wirklich, dass irgendjemand das alles liest? –

+1

@JohnSaunders Sie brauchen nicht das gesamte Json-Objekt durch zu lesen - Ich bin ziemlich sicher, Sie können sehen, dass es nur drei Knoten im Hauptobjekt gibt und das Datenobjekt ist die gleiche durch den ganzen Weg hindurch? – PeteFox

Antwort

17

Da diese JSON nicht C# freundlich ist, Ich musste ein bisschen Hacking machen, damit es richtig herauskam. Das Ergebnis ist jedoch sehr nett.

var json = JsonConvert.DeserializeObject<dynamic>(sampleJson); 
var data = ((JObject)json.data).Children(); 
var stuff = data.Select(x => new { AreaCode = x.Path.Split('.')[1], City = x.First()["city"], State = x.Last()["state"] }); 

Dieser Code generiert einen anonymen Typ, der die Daten am besten darstellt. Der anonyme Typ kann jedoch problemlos durch eine ctor für eine normalere DTO-Klasse ersetzt werden.

Die Ausgabe sieht etwa so aus:

Deserialization Output

+0

Können Sie erklären, was ist * Daten * in * json.data *? Danke –

+0

@HappyBird, das kommt aus dem Beispiel, das JSON in der Frage gepostet hat. –

0

Ich weiß nichts über RestSharp, aber wenn Sie mit Newtonsoft auf dem Server Seite, dann können Sie einfach eine JObject an Ihre Methode übergeben. Dann können Sie das Objekt abfragen, um zu sehen, um was für ein Objekt es sich handelt, und JObject.ToObject() verwenden, um es zu konvertieren.

3

Ihre json falsch ist, aber wenn Sie es tun korrigieren können Sie eine json-to-csharp Tool wie das auf http://json2csharp.com/ verwenden, um Ihre Klassen zu generieren:

public class __invalid_type__201 
{ 
    public string city { get; set; } 
    public string state { get; set; } 
} 

public class Data 
{ 
    public __invalid_type__201 __invalid_name__201 { get; set; } 
} 

public class RootObject 
{ 
    public bool success { get; set; } 
    public string message { get; set; } 
    public Data data { get; set; } 
} 
+1

Das ist eine großartige Idee ... Leider ist das JSON nicht in meinen Händen - Es kommt von einer externen API – PeteFox

+1

@PeteFox es ist nicht gültig JSON. Alle Feldnamen sollten in Anführungszeichen gesetzt werden, damit sie als gültiger JSON gelten. Deshalb erzeugt json2csharp.com ungültige Klassen. –

Verwandte Themen