首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >json.net IEnumerable

json.net IEnumerable
EN

Stack Overflow用户
提问于 2012-06-30 17:48:17
回答 3查看 4.9K关注 0票数 3

我有以下json文件

代码语言:javascript
复制
{"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来实现这一点,我尝试了如下内容

代码语言:javascript
复制
JObject o = JObject.Parse(json);
Title = o["fields"].Select(q => q["extenral_id"].Values[0] == "title");

这在语法上是不正确的。我不是很精通Lambda或者Linq,尽管它已经在那里有一段时间了。感谢你的帮助

谢谢

耶伊亚

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-30 18:02:57

或者你可以这样做:

代码语言:javascript
复制
 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

或者,您可以将其链接在一起,并在一行中选择对象:

代码语言:javascript
复制
var myVal = JObject.Parse(json)["fields"].Children()
                                        .Where(w => w["external_id"].ToString() == "title")
                                        .First();

从那里你可以添加任何你想要的选择器,比如如果你想要external_id的值,然后在第一个()选择器的末尾附加"external_id".ToString()。

票数 6
EN

Stack Overflow用户

发布于 2012-06-30 18:01:07

首先为你的对象构建类,然后解析它们,这样你就可以正确地访问它们,它不再是匿名类型。

例如,下面的类:

代码语言:javascript
复制
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 (目前不知道确切的语法),如下所示:

代码语言:javascript
复制
var o = Json.Parse(json, typeof(MyJson));

然后,您可以使用Linq轻松选择数据,并在VS (或类似的开发环境)中使用intellisense:

代码语言:javascript
复制
var myData = o.fields.Where(q=>q.external_id=="title");
票数 1
EN

Stack Overflow用户

发布于 2012-06-30 19:21:35

如果您将JSON转换为对象(基本上是Marc建议的),LINQ查询将如下所示:

代码语言:javascript
复制
o.fields.Single(q => q.external_id == "title")

但如果您不想这样做,则必须通过字符串键访问值。如果不想转换值的类型,可以简单地使用索引(["key"])。但是如果你想转换类型,你可以使用Value<Type>("key")。把它们放在一起,整个查询可能是:

代码语言:javascript
复制
o["fields"].Single(q => q.Value<string>("external_id") == "title")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11273151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档