2017-04-08 156 views
0

我有這個結構的JSON文件:如何從反序列化的嵌套對象獲取屬性?

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

後,我想在每一個數據對象的屬性。所以這裏是我的代碼到目前爲止:

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

如果有人可以幫助我這個,我將非常感激。此外,要將所有對象屬性添加到列表中並將它們綁定也非常重要。我困在當下。

舉例: ListBox1中:PERSONID:PERSON1,PERSON2,Person3可能 ListBox2:姓名/年齡/身高/愛好 TextBox3:輸出屬性

謝謝!

更新:我已經在黑暗中,直到目前正在尋找這是我得到

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

    } 
} 

輸出控制檯:角色:Bobby年齡:25身高:178愛好:鋼琴

回答

1

好開始看起來好像你沒有完全理解類和對象。你不想爲每個人創建一個新的班級,而是要創建一個新的人班。例如:

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

此代碼創建人類的3個實例。您現在可以自由設置/獲取person類的每個實例的屬性。

注意:上述代碼使用默認的構造函數,您可以創建自己的構造函數以在實例化時分配persons屬性的值。

你的個人類可能是這樣的:

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

注:這是慣例使用PascalCase的性能,因爲它們的訪問方法,它也是良好的禮儀,往往有利於覆蓋的ToString()

好了,現在我們可以看看你的JSON。您創建三個JSON陣列,這是我想要不覺得,所以我就改到三個JSON對象:

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

現在我們已經清除了您的JSON,我們可以一起比分扳成:

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

當從JObject首先獲取值時,您必須獲得密鑰,在這種情況下密鑰爲「person1」,然後通過使用令牌名稱將值分配給令牌,然後您必須適當地處理返回的值令牌,這可以採取許多形式,但通過簡單的轉換和ToStrings實現。

現在你可以沖洗和重複創建人類的實例,從您已經創建JObject實例分配其屬性和使用它們,但是你會想,在我的情況下將其寫入到控制檯。

編輯使用原裝JSON結構

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

呀,你所提到的結構標準。這就是爲什麼我花了一個星期沒有進步。 JSON文件不是由我創建的,它來自我網站上的家庭作業JSON數據。我將其內容更改爲「人員」以便於堆棧回答。他使用的[{a},{b},{c}]是一組對象,而不是使用[a,b,c]數組。我無法更改我的JSON結構,因爲我必須從中獲取實時數據... –

+0

不,他沒有使用過一組對象。他已經使用了三個陣列。我可以更新我的答案以保留其餘結構,但對我來說似乎很奇怪。 – Dec

+0

請幫助我,我不知道爲什麼他的結構看起來很愚蠢。 我有一些進展。讓我們來看看 –

相關問題