2017-04-08 2 views
0

Ich habe eine JSON-Datei mit dieser Struktur:Wie erhält man ein Attribut von einem deserialisierten verschachtelten Objekt?

{ 
    "person1": [{"name": "Bobby"}, {"age": 25}, {"height": 178}, {"hobby": "piano"}], 
    "person2": [{"name": "Tyler"}, { "age": 29}, {"height": 185}, {"hobby": "basketball"}], 
    "person3": [{"name": "Mike"}, {"age": 30}, {"height": 192}, {"hobby": "football"}] 
} 

Danach habe ich das Attribut jedes Objekts in den Daten erhalten möchten. Also hier ist mein Code so weit:

 JObject json = JObject.Parse(File.ReadAllText(*JSON file*)); 
     jsonString = json.ToString();  
     RootObject data = JsonConvert.DeserializeObject<RootObject>(jsonString); 


     //Needed code here 
     Console.Writeline(*hobby of Tyler*) 

     Console.ReadKey(); 


    } 
} 
//====================================JSON class====================================== 
public class Person1 
{ 
    public string name { get; set; } 
    public Int16 age { get; set; } 
    public Int16 height { get; set; } 
    public string hobby { get; set; } 
} 

public class Person2 
{ 
    public string name { get; set; } 
    public Int16 age { get; set; } 
    public Int16 height { get; set; } 
    public string hobby { get; set; } 
} 

public class Person3 
{ 
    public string name { get; set; } 
    public Int16 age { get; set; } 
    public Int16 height { get; set; } 
    public string hobby { get; set; } 
} 

public class RootObject 
{ 
    public List<Person1> person1 { get; set; } 
    public List<Person2> person2 { get; set; } 
    public List<Person3> person3 { get; set; } 
} 
} 

Ich würde wirklich geschätzt werden, wenn mir jemand dabei helfen kann. Außerdem ist es wichtig, alle Objekteigenschaften zu einer Liste hinzuzufügen und zu verknüpfen. Ich stecke den Moment fest.

Beispiel: ListBox1: personID: person1, person2, Person3 ListBox2: Name/Alter/Höhe/Hobby TextBox3: Ausgabeattribut

Vielen Dank!

UPDATE: Ich habe in der Dunkelheit suchen und bis jetzt ist es das, was ich

class Program 
    { 
     public static string url = @"C:\Users\Admin\Desktop\getData3.json"; 
     public static string jsonString = ""; 
     static void Main(string[] args) 
     { 
      JObject json = JObject.Parse(File.ReadAllText(url)); 
      jsonString = json.ToString(); 

      //==========Second Method======================================= 
      Console.WriteLine("=============================================================="); 
      Console.Write("name: "+ person.person1[0].name); 
      Console.Write(" age: "+ person.person1[1].age); 
      Console.Write(" height: "+ person.person1[2].height); 
      Console.WriteLine(" hobby: "+ person.person1[3].hobby); 


      Console.ReadKey(); 

     } 
    } 
    //CLass=================================== 
    public class Person 
    { 

     public string name { set; get; } 

     public int age { set; get; } 

     public int height { set; get; } 


     public string hobby { set; get; } 
    } 

    public class RootObject 
    { 
     public List<Person> person1 { get; set; } 
     public List<Person> person2 { get; set; } 
     public List<Person> person3 { get; set; } 

    } 
} 

OUTPUT-Konsole erhalten: Name: Bobby Alter: 25 Größe: 178 Hobbys: Klavier

Antwort

1

Nun zu beginnen Es scheint, als ob Sie Klassen und Objekte nicht vollständig verstehen. Sie möchten keine neue Klasse für jede Person erstellen, sondern eine neue Instanz der Personenklasse. Beispiel:

Person person1 = new Person(); 
Person person2 = new Person(); 
Person person3 = new Person(); 

Dieser Code erstellt 3 Instanzen der Personenklasse. Sie können nun die Eigenschaften jeder Instanz der Personenklasse festlegen/abrufen.

Hinweis: dass der obige Code den Standardkonstruktor verwendet, können Sie einen eigenen Konstruktor erstellen, um den Wert der Personeneigenschaften zum Zeitpunkt der Instanziierung zuzuweisen.

Ihre Person Klasse könnte wie folgt aussehen:

public class Person { 
    public string Name { get; set; } 
    public Int16 Age { get; set; } 
    public Int16 Height { get; set; } 
    public string Hobby { get; set; } 

    public override string ToString() 
    { 
     return $"Name: {Name}, Age: {Age}, Height: {Height}, Hobby: {Hobby}"; 
    } 
} 

Hinweis: diese Konvention ist Pascal Objekte zu verwenden, wie sie Accessormethoden sind, ist es auch gut, Etikette und oft hilfreich ToString außer Kraft zu setzen()

Okay, jetzt können wir uns Ihren JSON ansehen. Sie erstellen drei JSON-Arrays, die ich nicht glaube, Sie wollen, also habe ich es zu drei JSON Objekte geändert:

{ 
    "person1": {"name": "Bobby", "age": 25, "height": 178, "hobby": "piano"}, 

    "person2": {"name": "Tyler", "age": 29, "height": 185, "hobby": "basketball"}, 

    "person3": {"name": "Mike", "age": 30, "height": 192, "hobby": "football"} 
} 

Jetzt haben wir Ihre JSON gereinigt wir es zusammen binden können:

static void Main(string[] args) { 
    //Create an instance of the person class 
    Person person1 = new Person(); 

    //Create a json object from your file 
    JObject json = JObject.Parse(File.ReadAllText(@"json-file-path")); 

    //Assign the instances properties using the json object 
    person1.Name = json["person1"]["name"].ToString(); 
    person1.Age = Convert.ToInt16(json["person1"]["age"]); 
    person1.Height = Convert.ToInt16(json["person1"]["height"]); 
    person1.Hobby = json["person1"]["hobby"].ToString(); 

    //Write the person object to the console 
    Console.WriteLine(person1.ToString()); 
} 

Wenn Sie zuerst Werte von einem JObject abrufen, müssen Sie den Schlüssel abrufen, in diesem Fall ist der Schlüssel "person1", und dann wird Wert einem Token unter Verwendung des Token-Namens zugewiesen, dann müssen Sie den von zurückgegebenen Wert entsprechend behandeln das Token, kann dies viele Formen annehmen, aber darüber hinaus durch einfache Converts und ToStrings.

Jetzt können Sie spülen und das Erstellen einer Instanz der Personenklasse wiederholen, indem Sie ihre Eigenschaften von Ihrer bereits erstellten JObject-Instanz zuweisen und sie wie gewünscht verwenden, indem Sie sie in die Konsole schreiben.

EDIT ORIGINAL JSON STRUKTUR

static void Main(string[] args) 
{ 
    //Create an instance of the person class 
    Person person1 = new Person(); 
    Person person2 = new Person(); 
    Person person3 = new Person(); 

    //Create a json object from your file 
    JObject json = JObject.Parse(File.ReadAllText(@"json-file-path")); 

    //Get the jarray for each person 
    JArray a1 = (JArray)json["person1"]; 
    JArray a2 = (JArray)json["person2"]; 
    JArray a3 = (JArray)json["person3"]; 

    //person 1 
    person1.Name = a1[0]["name"].ToString(); 
    person1.Age = Convert.ToInt16(a1[1]["age"]); 
    person1.Height = Convert.ToInt16(a1[2]["height"]); 
    person1.Hobby = a1[3]["hobby"].ToString(); 

    //person 2 
    person2.Name = a2[0]["name"].ToString(); 
    person2.Age = Convert.ToInt16(a2[1]["age"]); 
    person2.Height = Convert.ToInt16(a2[2]["height"]); 
    person2.Hobby = a2[3]["hobby"].ToString(); 

    //person 3 
    person3.Name = a3[0]["name"].ToString(); 
    person3.Age = Convert.ToInt16(a3[1]["age"]); 
    person3.Height = Convert.ToInt16(a3[2]["height"]); 
    person3.Hobby = a3[3]["hobby"].ToString(); 

    Console.WriteLine(person1.ToString()); 
    Console.WriteLine(person2.ToString()); 
    Console.WriteLine(person3.ToString()); 
} 
+0

Ja, Ihre erwähnten Struktur der Norm zu verwenden ist. Deshalb brauchte ich eine Woche ohne Fortschritt. Die JSON-Datei wird nicht von mir erstellt, sie stammt aus meinen Hausaufgaben-JSON-Daten von einer Website. Ich habe den Inhalt in "Person" geändert, um die Stapelverarbeitung zu vereinfachen. Anstatt ein Array von [a, b, c] zu verwenden, benutzte er [{a}, {b}, {c}], was ein Array von Objekten ist. Ich kann meine JSON-Struktur nicht ändern, weil ich Live-Daten von ihm erhalten muss ... –

+0

Nein, er hat kein Array von Objekten verwendet. Er hat drei Arrays benutzt. Ich kann meine Antwort aktualisieren, um die verbleibende Struktur zu behalten, aber es scheint mir seltsam. – Dec

+0

Bitte helfen Sie mir, ich weiß nicht, warum seine Struktur so dumm aussieht. Ich habe Fortschritte gemacht. Lass es uns sehen –

Verwandte Themen