2017-04-08 109 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

请帮助我,我不知道为什么他的结构看起来很愚蠢。 我有一些进展。让我们来看看 –