NewtonSoft JArray - 如何使用LINQ选择多个元素

问题描述:

我有一些JSON然后解析为JArray对象。我想过滤JArray,因此它只有两个属性Title和BodyText。但是无论我尝试什么,我只能使用LINQ选择一个值。NewtonSoft JArray - 如何使用LINQ选择多个元素

[HttpGet] 
public JsonResult AjaxGetNewsItems() 
{ 
    string json = JsonConvert.SerializeObject(news.GetNewsItems(), formatting:Formatting.Indented); 
    var v = JArray.Parse(json); 

    //var items = 
    // v.Where(
    //  x => 
    //   x["Title"].ToString() != string.Empty && 
    //   x["BodyText"].ToString() != string.Empty) 
    //  .Select(x => x["Title"]) 
    //  .ToList(); 

    var title = (string) v[0]["Title"]; 

    var titleBodytext = from p in v 
    select v[0]["Title"]["BodyText"]; 
    foreach (var item in titleBodytext) 
    { 
    } 
    //var titleBodytext = 
    // from c in v[0]["Title"]["BodyText"] 
    // group c by c 
    // into g 
    // select new { }; 

    //JArray a = JArray.FromObject(news.GetNewsItems()); 
    //string titleBodytext = (string) newsItems["Title"]["Bodytext"]; 

    return new JsonResult() 
    { 
     Data = json, 
     JsonRequestBehavior = JsonRequestBehavior.AllowGet, 
     MaxJsonLength = Int32.MaxValue 
    }; 
} 

我想改变这种代码:

var titleBodytext = from p in v 
        select v[0]["Title"]["BodyText"]; 

TitleBodyText在我JArray两个键的值。 JArray对象的

enter image description here

见截图。在元素0中存在关键值元素。

+0

试试这个'var titleBodytext = from p in v select new {Title = p [0] [“title”],Body = p [0] [“bodyText”]' – 2014-10-17 11:10:07

+0

@Thirisangu我现在就试一试。所以我想将它投影到令人讨厌的收藏中? – 2014-10-17 11:14:53

+0

@Thirisangu我有这个错误:其他信息:访问JObject值与无效键值:0.预期的对象属性名称。 – 2014-10-17 11:19:16

试试这个方法:

var titleBodytext = from p in v 
        select new 
          { 
          Title = (string)p["Title"], 
          Text = (string)p["BodyText"] 
          }; 

或者,如果你确定v总是只包含一个元素:

var titleBodytext = new 
        { 
         Title = (string)v[0]["Title"], 
         Text = (string)v[0]["BodyText"] 
        }; 

顺便说一句,你目前的代码不会似乎做你的想法。它在from子句中有p in v,但始终选择v[0],而不管当前p是上下文。无论如何,在v只包含一个元素的情况下,这不会显示错误的行为。

+0

谢谢你的代码工作。我不太确定我做错了什么。也许我不需要索引?我经常使用LINQ,它从来没有这么麻烦。 – 2014-10-17 11:48:45

+0

@nickgowdy是的,你不需要索引,更重要的是你需要在'select'子句中使用'p'而不是'v'。 – har07 2014-10-17 11:51:54

+0

@ hara07好吧,我明白为什么它不起作用。谢谢你的帮助。 – 2014-10-17 13:08:05