我有以下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="title"的字段的值,我正在使用 Json.Net 并且已经解析了对象。我如何在 Json 对象上使用 lambda 或 linq 来做到这一点,我尝试了这样的东西
JObject o = JObject.Parse(json);
Title = o["fields"].Select(q => q["extenral_id"].Values[0] == "title");
就语法而言,这是不正确的事件。我对Lambda不是很精通,或者Linq认为它已经存在了一段时间。感谢帮助
谢谢
叶海亚
你可以这样做:
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() 到 first() 选择器的末尾。
首先为您的对象构建类,然后解析它们,以便您可以正确访问它们,并且不再使用匿名类型。
例如,这些类:
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(或类似的开发环境)中具有智能感知:
var myData = o.fields.Where(q=>q.external_id=="title");
如果你将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")