我有以下json文件
{"fields":[
{
"status":"active",
"external_id":"title",
"config":{},
"field_id":11848871,
"label":"Title",
"values":[
{
"value":"Test Deliverable"
}
],
"type":"text"
},{
"status":"active",
"external_id":"client-name",
"config":{},
"field_id":12144855,
"label":"Client Name",
"values":[
{
"value":"Chcuk Norris"
}
],
"type":"text"
}}并且我希望选择其标题为“external_id”的字段的值。例如,我使用的是Json.Net,并且已经解析了对象。如何在Json对象上使用lambda或linq来实现这一点,我尝试了如下内容
JObject o = JObject.Parse(json);
Title = o["fields"].Select(q => q["extenral_id"].Values[0] == "title");这在语法上是不正确的。我不是很精通Lambda或者Linq,尽管它已经在那里有一段时间了。感谢你的帮助
谢谢
耶伊亚
发布于 2012-06-30 18:02:57
或者你可以这样做:
string json = "{\"fields\":[{\"status\":\"active\",\"external_id\":\"title\",\"config\":{},\"field_id\":11848871,\"label\":\"Title\",\"values\":[{\"value\":\"Test Deliverable\"}],\"type\":\"text\"},{\"status\":\"active\",\"external_id\":\"client-name\",\"config\":{},\"field_id\":12144855,\"label\":\"Client Name\",\"values\":[{\"value\":\"Chcuk Norris\"}],\"type\":\"text\"}]}";
JObject obj = JObject.Parse(json);
JArray arr = (JArray)obj["fields"];
var externalIds = arr.Children().Select(m=>m["external_id"].Value<string>());externalIds是字符串数组的IEnumerable
或者,您可以将其链接在一起,并在一行中选择对象:
var myVal = JObject.Parse(json)["fields"].Children()
.Where(w => w["external_id"].ToString() == "title")
.First();从那里你可以添加任何你想要的选择器,比如如果你想要external_id的值,然后在第一个()选择器的末尾附加"external_id".ToString()。
发布于 2012-06-30 18:01:07
首先为你的对象构建类,然后解析它们,这样你就可以正确地访问它们,它不再是匿名类型。
例如,下面的类:
class MyJson {
public List<MyField> fields {get;set;}
}
class MyField {
public string status {get;set;}
public string external_id {get;set;}
// and so on
}然后使用这个类来解析json (目前不知道确切的语法),如下所示:
var o = Json.Parse(json, typeof(MyJson));然后,您可以使用Linq轻松选择数据,并在VS (或类似的开发环境)中使用intellisense:
var myData = o.fields.Where(q=>q.external_id=="title");发布于 2012-06-30 19:21:35
如果您将JSON转换为对象(基本上是Marc建议的),LINQ查询将如下所示:
o.fields.Single(q => q.external_id == "title")但如果您不想这样做,则必须通过字符串键访问值。如果不想转换值的类型,可以简单地使用索引(["key"])。但是如果你想转换类型,你可以使用Value<Type>("key")。把它们放在一起,整个查询可能是:
o["fields"].Single(q => q.Value<string>("external_id") == "title")https://stackoverflow.com/questions/11273151
复制相似问题