如何使用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");
的问题是,您试图访问一个名为Property
财产不中你的类存在。相反,你的类有Property
对象的数组:
public Property[] Properties { get; set; }
同样的Property
类有Grade
对象的数组不是一个单一的Grade
:
public Grade[] Grades { get; set; }
因此,你必须索引到数组找到具体为Property
或Grade
。如果您总是要使用的每个数组中的第一项,这可以很容易地Enumerable.Select
和Enumerable.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); }
}
}
你的'Properties'阵列得到什么? –
没有没有得到任何东西。 – Carell