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)
Title和BodyText是我的JArray中的两个键值。

请参见JArray对象的屏幕快照。在元素0中,有键值元素。
尝试这种方式:
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 v在from子句中具有,但v[0]无论当前p是上下文如何,都始终选择。无论如何,在v仅包含一个元素的情况下,这不会显示错误的行为。