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

nic*_*wdy 1 c# linq arrays json 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
    };
}
Run Code Online (Sandbox Code Playgroud)

我想更改此代码:

var titleBodytext = from p in v
                    select v[0]["Title"]["BodyText"];
Run Code Online (Sandbox Code Playgroud)

TitleBodyText是我的JArray中的两个键值。

在此处输入图片说明

请参见JArray对象的屏幕快照。在元素0中,有键值元素。

har*_*r07 5

尝试这种方式:

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

或者,如果您确定v始终只包含一个元素:

var titleBodytext = new 
                    { 
                        Title = (string)v[0]["Title"], 
                        Text = (string)v[0]["BodyText"] 
                    };
Run Code Online (Sandbox Code Playgroud)

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