2016-08-03 6 views
-1

Ich habe eine JObject die json mit der gleichen Struktur wie meine Geräteklasse enthält:Objekt von dynamischen Objekt

public class Entry 
    { 
     public string key { get; set; } 
     public object value { get; set; } 
    } 

    public class Detail 
    { 
     public List<Entry> entry { get; set; } 
    } 


    public class Device 
    { 
     public List<Detail> details { get; set; } 
    } 

Ich speichere die json als dynamisch:

dynamic d = JsonConvert.DeserializeObject(json); 

Ich möchte ein erstellen Geräteobjekt aus dem dynamischen Objekt:

new Device { details = d.details } 

Ich kann nicht einfach so tun, weil Details eine Liste ist, die enthält eine Liste, und die Liste muss mit einem Konstruktor erstellt werden, ich kann nicht herausfinden, wie das geht. Sollte etwas wie sein?

new Device { details = new List<Detail> (entry = new List<Entry>(some list from d?))}} 

Bitte beraten Sie mich.

EDIT:

Die Json und mein Objekt hat die gleiche Struktur nicht geteilt, es teilweise der Fall ist, so kann ich nicht einfach die während json konvertieren.

+0

Warum nicht direkt als Eintrag deserialisieren? Verwenden Sie var entry = JsonConvert.DeserializeObject (Zeichenfolge json); – bedane

+0

Es ist nicht genau das gleiche, es teilt Ähnlichkeit, es ist nur diese Details Eigenschaft, die ich habe mit Problem beim Erstellen meiner tatsächlichen Objekt. Es ist fast 1000 Eigenschaften in den Objekten, so dass ich nicht alles hier posten kann. –

+0

Warum verwenden Sie 'dynamic'? Vollständiges Objekt deserialisieren, was auch immer es als konkreter Typ ist. Wenn beide "Liste " enthalten, dann weisen Sie einfach den Wert einer Eigenschaft einer anderen Eigenschaft zu. – Sinatr

Antwort

1

Wenn Ihr JSON genau die gleiche Struktur wie Device Klasse hat, dann sollten Sie in der Lage sein, nur JsonConvert.DeserializeObject<Device>(jsonString).

Auch wenn das ursprüngliche JSON noch mehr Eigenschaften hat, solange Ihre Klassen die gleichen Eigenschaftsnamen haben, und was ein Array ist, ist ein Array usw. sollte es funktionieren.

Probe:

public class Entry 
    { 
     public string key { get; set; } 
     public object value { get; set; } 
    } 

    public class Detail 
    { 
     public List<Entry> entry { get; set; } 
    } 


    public class Device 
    { 
     public List<Detail> details { get; set; } 
    } 

void Main() 
{ 
    var json = @" 
    { 
     ""irrelevant"": ""fnord"", 
     ""also_irrelevant"": [1,3,5,7], 
     ""details"": [ 
     { 
     ""not_entry"": true, 
     ""entry"": [ 
      { 
      ""key"": ""x"", 
      ""value"": ""1"" 
      }, 
      { 
      ""key"": ""y"", 
      ""value"": ""2"" 
      } 
     ] 
     }, 
     { 
     ""entry"": [ 
      { 
      ""key"": ""a"", 
      ""value"": ""3"", 
      ""bummer"": ""hello"" 
      }, 
      { 
      ""key"": ""b"", 
      ""value"": ""4"", 
      ""bummer"": ""hello"" 
      } 
     ] 
     } 
     ] 
    }"; 

    Newtonsoft.Json.JsonConvert.DeserializeObject<Device>(json).Dump(); 
} 

Dies läuft für mich schön in LINQPad zeigt, Geräteklasse mit einer Liste von Details Klassen (2 Einträge), die jeweils mit einer Liste der Eintrag Klassen (2 Einträge jeweils), die sich mit das Set des Kvps.

Wenn du kannst, würde ich diesen Weg gehen. Wenn aus irgendeinem Grund die Benennung der Eigenschaften deaktiviert ist und Sie sie nicht ändern können, können Sie immer [JsonProperty("actual_json_name")] verwenden, um sie zu überschreiben.

+0

Es ist nicht genau das gleiche, es teilt Ähnlichkeit, es ist nur diese Details Eigenschaft, die ich habe mit Problem bei der Erstellung meiner tatsächlichen Objekt. Es ist fast 1000 Eigenschaften in den Objekten, so dass ich nicht alles hier posten kann. –