2015-07-01 238 views
2

我有更新的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

回答

1

的問題是,您試圖訪問一個名爲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

相關問題