如何使用Newtonsoft.Json从JSON子数组中获取数据?

如何使用Newtonsoft.Json从JSON子数组中获取数据?

问题描述:

我有更新的JSON表如下如何使用Newtonsoft.Json从JSON子数组中获取数据?

{“学生”:[{“name”:“Alex”,“lastname”:“Dean”,“Properties”:[{“iq”:120, “头发”:“黑色”,“眼镜”:“是”,“等级”:[{“数学”:44,“点亮”:“88”}]},{“iq”:120,“头发”: “金发”,“眼镜”:“是”,“等级”:[{“数学”:22,“点亮”:“81”}]},{“iq”:144,“头发”:“棕色” “眼镜”:“是”,“等级”:[{“数学”:44,“点亮”:“88”}]},{“iq”:120,“头发”:“红色”,“眼镜”: “是”,“等级”:[{“Math”:44,“Lit”:“88”}]}]}]}

我设法得到不在子数组内的名字和姓氏,但无法弄清楚如何获取子数组内的其他数据。在数组“学生”内部,有一个名为“属性”的子数组和名为“成绩”的“属性”内的另一个子数组。

如何获得“发型”和“数学”属性?

这是我在做什么来获取姓名。

这里是我的WebService类

public class WebService 
    { 
     public WebService() 
     { 

     } 

     public async Task<Rootobject> GetStudentInfoAsync (string apiurl) { 

      var client = new HttpClient(); 

      var response = await client.GetStringAsync(string.Format(apiurl)); 

      return JsonConvert.DeserializeObject<Rootobject>(response.ToString()); 

     } 
    } 

这里是我想出了一个视图模型。为什么它不工作。我没有得到价值。

namespace MyApp 
{ 
    public class Grade 
    { 
     public string Math { get; set; } 
     public string Lit { get; set; } 

    } 

    public class Property 
    { 

     public int iq { get; set; } 
     public string hair { get; set; } 
     public string glasses { get; set; } 

     public Grade[] Grades { get; set; } 

    } 
    public class StudentInfo 
    { 
     public string name { get; set; } 
     public string lastname { get; set; } 

     public Property[] Properties { get; set; } 

     public string StudentName { 
      get{ return String.Format ("{0}", name); } 
     } 
//Why isn't the following code work? I am not getting the values and I get errors. 

     public string HairColor { 
      get{ return String.Format ("{0}",Property.hair); } 
     } 
     public string MathGrade { 
      get{ return String.Format ("{0}", Property.Grade.Math); } 
     } 

    } 

    public class Rootobject 
    { 
     public StudentInfo[] students { get; set; } 

    } 
} 

这里是我如何填充我的列表视图与学生的姓名

var sv = new WebService(); 
      var es = await sv.GetStudentInfoAsync(apiurl); 
      Xamarin.Forms.Device.BeginInvokeOnMainThread(() => { 

       listView.ItemsSource = es.students; 
      }); 
var cell = new DataTemplate (typeof(TextCell)); 

      listView.ItemTemplate = cell; 
      listView.ItemTemplate.SetBinding(TextCell.TextProperty, "StudentName"); 
+0

你的'Properties'阵列得到什么? –

+0

没有没有得到任何东西。 – Carell

的问题是,您试图访问一个名为Property财产不中你的类存在。相反,你的类有Property对象的数组:

public Property[] Properties { get; set; } 

同样的Property类有Grade对象的数组不是一个单一的Grade

public Grade[] Grades { get; set; } 

因此,你必须索引到数组找到具体为PropertyGrade。如果您总是要使用的每个数组中的第一项,这可以很容易地Enumerable.SelectEnumerable.FirstOrDefault完成:

public class StudentInfo 
{ 
    public string name { get; set; } 
    public string lastname { get; set; } 

    public Property[] Properties { get; set; } 

    public string StudentName { 
     get{ return String.Format ("{0}", name); } 
    } 
    public string HairColor { 
     get{ return (Properties ?? Enumerable.Empty<Property>()).Select(p => p.hair).FirstOrDefault(); } 
    } 

    public string MathGrade { 
     get { return (Properties ?? Enumerable.Empty<Property>()).SelectMany(p => p.Grades ?? Enumerable.Empty<Grade>()).Select(g => g.Math).FirstOrDefault(); } 
    } 
} 

,然后进行测试:

 var root = JsonConvert.DeserializeObject<Rootobject>(response); 
     Debug.Assert(root.students.Length == 1 && root.students[0].HairColor == "black" && root.students[0].MathGrade == "44"); // No assert. 

更新

作为StudentInfo s的财产,您无法获得“全部4名学生的头发”因此,在您的JSON中,每个学生在其"Properties"阵列中都有且仅有一个条目。如果您将JSON发布到http://jsonformatter.curiousconcept.com/,则可以更清楚地看到这一点。为了得到你需要的根对象的所有学生的发色或名称:

 var root = JsonConvert.DeserializeObject<Rootobject>(response); 

     var hairColors = root.students.Select(s => s.HairColor).ToArray(); 
     var studentNames = root.students.Select(s => s.StudentName).ToArray(); 

更新2

在更新后的问题也似乎的确是一个“学生”对象有多个发色属性,多个数学等级等等。在这种情况下,如果你想显示他们作为一个字符串,你需要为逗号分隔值上忙结合,例如:

public class StudentInfo 
{ 
    public string name { get; set; } 

    public string lastname { get; set; } 

    public Property[] Properties { get; set; } 

    public string StudentName 
    { 
     get { return name; } 
    } 

    public string[] HairColors 
    { 
     get 
     { 
      return (Properties ?? Enumerable.Empty<Property>()).Select(p => p.hair).ToArray(); 
     } 
    } 

    public string HairColorCSV 
    { 
     get { return string.Join(",", HairColors); } 
    } 

    public string[] MathGrades 
    { 
     get 
     { 
      return (Properties ?? Enumerable.Empty<Property>()).SelectMany(p => p.Grades ?? Enumerable.Empty<Grade>()).Select(g => g.Math).ToArray(); 
     } 
    } 

    public string MathGradeCSV 
    { 
     get { return string.Join(",", MathGrades); } 
    } 
} 
+0

我收到错误当前上下文中不存在名称“Enumerable”。 – Carell

+0

我正在与xamarin.forms – Carell

+0

@Carell - 我认为Linq是可用的xamarin形式。尝试添加'使用System.Linq;'和'System.Core.dll'的引用。请参阅[System.Linq命名空间不能解决?](https://forums.xamarin.com/discussion/4655/system-linq-namespace-doesnt-resolve) – dbc