2013-07-22 62 views
5

我使用Json.net序列化,然后制作,看起来像这样的JObject:Linq查询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": "", 
    }, 

我该怎么办查询到这个新的对象或列表,这是很容易投入到一些HTML表/图。 我只想显示CaseNumber,FirstName和Comment。

回答

5

我只是想显示CaseNumber,名字和注释。

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

然后在你的控制器动作,您建立从你已经有了JObject实例视图模型:

一如往常,在ASP.NET MVC,你可以通过编写符合您需求的视图模型开始:

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); 
} 

终于在强类型视图显示你想要的信息:

@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

只给了我一个新的对象有,没有查询工作。查询javascript对象更容易吗? – stianboe

0

我想你想的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': '' 
            } 
           }, 
          ] 
} 

如果是这样,你可以得到下面的代码对你的问题的工作:

  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

几种方法:

1)根据文档'Using LINQ for JSON',您可以使用LINQ方式查询JObject

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)用于通过指定的路径类似这样的查询定制帮手extention方法:

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; 
    } 
}