3

我有以下 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 认为它已经存在了一段时间。感谢帮助

谢谢

耶希亚

4

3 回答 3

6

或者你可以这样做:

 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() 选择器的末尾。

于 2012-06-30T10:02:56.573 回答
1

首先为您的对象构建类,然后解析它们,以便您可以正确访问它们并且不再是匿名类型。

例如这个类:

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");
于 2012-06-30T10:01:07.450 回答
1

如果您将 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")
于 2012-06-30T11:21:35.180 回答