2013-07-22 41 views
5

Tôi đang sử dụng Json.net cho serializing và sau đó làm một JObject trông như thế này:LINQ truy vấn JObject

"RegistrationList": [ 
    { 
     "CaseNumber": "120654-1330", 
     "Priority": 5, 
     "PersonId": 7, 
     "Person": { 
     "FirstName": "", 
     "LastName": "", 
     }, 
     "UserId": 7, 
     "User": { 
     "Id": 7, 
     "CreatedTime": "2013-07-05T13:09:57.87", 
     "Comment": "", 
    }, 

Làm thế nào để tôi truy vấn này vào một đối tượng mới hoặc danh sách, đó là dễ dàng đưa vào một số html bảng/xem. Tôi chỉ muốn hiển thị CaseNumber, FirstName và Comment.

Trả lời

5

Tôi chỉ muốn hiển thị CaseNumber, FirstName và Comment.

Như mọi khi trong ASP.NET MVC bạn có thể bắt đầu bằng cách viết một mô hình điểm cho rằng phù hợp với yêu cầu của bạn:

public class MyViewModel 
{ 
    public string CaseNumber { get; set; } 
    public string FirstName { get; set; } 
    public string Comment { get; set; } 
} 

sau đó trong hành động điều khiển của bạn, bạn xây dựng mô hình nhìn từ ví dụ JObject bạn đã có :

public ActionResult Index() 
{ 
    JObject json = ... the JSON shown in your question (after fixing the errors because what is shown in your question is invalid JSON) 

    IEnumerable<MyViewModel> model = 
     from item in (JArray)json["RegistrationList"] 
     select new MyViewModel 
     { 
      CaseNumber = item["CaseNumber"].Value<string>(), 
      FirstName = item["Person"]["FirstName"].Value<string>(), 
      Comment = item["User"]["Comment"].Value<string>(), 
     }; 

    return View(model); 
} 

và cuối cùng theo quan điểm mạnh mẽ gõ của bạn, bạn hiển thị các thông tin mong muốn:

@model IEnumerable<MyViewModel> 

<table> 
    <thead> 
     <tr> 
      <th>Case number</th> 
      <th>First name</th> 
      <th>Comment</th> 
     </tr> 
    </thead> 
    <tbody> 
     @foreach (var item in Model) 
     { 
      <tr> 
       <td>@item.CaseNumber</td> 
       <td>@item.FirstName</td> 
       <td>@item.Comment</td> 
      </tr> 
     } 
    </tbody> 
</table> 
-1
 


    var serializer = new JavaScriptSerializer(); 
    object modelData = serializer.DeserializeObject(jsonstring); 

+0

đó chỉ mang lại cho tôi một đối tượng mới để làm việc với, không có truy vấn. Việc truy vấn đối tượng javascript có dễ dàng hơn không? – stianboe

0

Tôi nghĩ rằng bạn muốn để có được những chuỗi JSON như dưới đây:

{ 
'RegistrationList': [  
      { 
       'CaseNumber': '120654-1330', 
            'Priority': 5, 
            'PersonId': 7, 
            'Person': { 
             'FirstName': '0', 
             'LastName': '', 
            }, 
            'UserId': 7, 
            'User': { 
             'Id': 7, 
             'CreatedTime': '2013-07-05T13:09:57.87', 
             'Comment': '' 
            } 
           }, 
           { 
            'CaseNumber': '120654-1330', 
            'Priority': 5, 
            'PersonId': 7, 
            'Person': { 
             'FirstName': '0', 
             'LastName': '', 
            }, 
            'UserId': 7, 
            'User': { 
             'Id': 7, 
             'CreatedTime': '2013-07-05T13:09:57.87', 
             'Comment': '' 
            } 
           }, 
          ] 
} 

Nếu vậy, bạn có thể nhận được mã dưới đây làm việc cho câu hỏi của bạn:

  string json = @"{ 
          'RegistrationList': [ 
           { 
            'CaseNumber': '120654-1330', 
            'Priority': 5, 
            'PersonId': 7, 
            'Person': { 
             'FirstName': '0', 
             'LastName': '', 
            }, 
            'UserId': 7, 
            'User': { 
             'Id': 7, 
             'CreatedTime': '2013-07-05T13:09:57.87', 
             'Comment': '' 
            } 
           }, 
           { 
            'CaseNumber': '120654-1330', 
            'Priority': 5, 
            'PersonId': 7, 
            'Person': { 
             'FirstName': '0', 
             'LastName': '', 
            }, 
            'UserId': 7, 
            'User': { 
             'Id': 7, 
             'CreatedTime': '2013-07-05T13:09:57.87', 
             'Comment': '' 
            } 
           }, 
          ] 
         }"; 
     JObject o = JObject.Parse(json); 
     JArray list = (JArray)o["RegistrationList"]; 
     List<Tuple<string, string, string>> rList = new List<Tuple<string, string, string>>(); 
     foreach (var r in list) 
     { 
      Tuple<string, string, string> temp = new Tuple<string, string, string>(r["CaseNumber"].Value<string>(), r["Person"]["FirstName"].Value<string>(), r["User"]["Comment"].Value<string>()); 
      rList.Add(temp); 
      Console.WriteLine(temp); 
     } 
2

Một số cách sau:

1) Theo tài liệu 'Using LINQ for JSON' bạn có thể truy vấn JObject theo cách LINQ

JObject o = JObject.Parse(@"{ 
    'CPU': 'Intel', 
    'Drives': [ 
    'DVD read/writer', 
    '500 gigabyte hard drive' 
    ] 
}"); 

string cpu = (string)o["CPU"]; 
// Intel 

string firstDrive = (string)o["Drives"][0]; 
// DVD read/writer 

IList<string> allDrives = o["Drives"].Select(t => (string)t).ToList(); 
// DVD read/writer 
// 500 gigabyte hard drive 

2) Querying JSON with SelectToken

3) Sử dụng phương pháp helper gia hạn tùy chỉnh để truy vấn bằng đường dẫn cụ thể như thế này:

public static class JsonHelpers 
{ 
    public static JToken QueryJson(this object jsonObject, params string[] jsonPath) 
    { 
     const string separator = " -> "; 

     if (jsonObject == null) 
      throw new Exception(string.Format("Can not perform JSON query '{0}' as the object is null.", 
       string.Join(separator, jsonPath ?? new string[0]))); 

     var json = (jsonObject as JToken) ?? JObject.FromObject(jsonObject); 
     var token = json; 
     var currentPath = ""; 

     if (jsonPath != null) 
      foreach (var level in jsonPath) 
      { 
       currentPath += level + separator; 
       token = token[level]; 
       if (token == null) break; 
      } 

     if (token == null) 
      throw new Exception(string.Format("Can not find path '{0}' in JSON object: {1}", currentPath, json)); 

     return token; 
    } 
}