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

时间:2014-10-17 10:48:45

标签: c# arrays json linq json.net

我有一些JSON然后我解析为JArray对象。我想过滤JArray,因此它只有两个属性,Title和BodyText。但无论我尝试什么,我只能使用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中的两个键值。

enter image description here

查看JArray对象的屏幕截图。在元素0中有键值元素。

1 个答案:

答案 0 :(得分:4)

尝试这种方式:

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"] 
                    };
顺便说一下,你现在的代码似乎并不像你想的那么做。它在p in v子句中有from,但无论当前v[0]是上下文,都始终选择p。无论如何,在v只包含一个元素的情况下,这并没有表现出错误的行为。