【问题标题】:Can I LINQ a JSON?我可以 LINQ 一个 JSON 吗?
【发布时间】:2013-09-16 11:47:29
【问题描述】:

这是我从 .NET 上的请求中获得的 JSON:

{
  "id": "110355660738", 
  "picture": {
    "data": {
      "url": "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/1027085_12033235063_5234302342947_n.jpg", 
      "is_silhouette": false
    }
  }
}

我想使用(也许?)LINQ 来捕获“url”字段。我做了很多这样的要求,这有点不同。所以我不会每次都创建一个 C# 类并反序列化它。

这是一种提取单个字段的方法吗?谢谢!

【问题讨论】:

    标签: c# .net json linq linq-to-json


    【解决方案1】:

    不需要Linq,只需使用dynamic(使用Json.Net

    dynamic obj = JObject.Parse(json);
    Console.WriteLine((string)obj.picture.data.url);
    

    Linq 版本不太可读

    JObject jObj = JObject.Parse(json);
    var url = (string)jObj.Descendants()
                        .OfType<JProperty>()
                        .Where(p => p.Name == "url")
                        .First()
                        .Value;
    

    文档:LINQ to JSON

    【讨论】:

    • 附注:.Where(p =&gt; p.Name == "url").First() 可以替换为 .First(p =&gt; p.Name == "url")
    • 当您使用dynamic 时,无需使用(string)obj.picture.data.url 中的演员表。你可以简单地写Console.WriteLine(obj.picture.data.url);,正确的重载会在运行时被调用!
    • @Nawaz 我知道,这只是为了表明 obj.picture.data.url 实际上是 JToken 而不是字符串。
    • 我认为你的意思是 ).Value&lt;string&gt;() 或类似的东西,导致你的代码无法工作。
    • 如果您希望您的代码在移动平台上可重用,不建议使用动态:stackoverflow.com/a/1668642
    【解决方案2】:

    我不会推荐 LINQ。我会推荐一个 JSON 库,例如 newtonsoft.json。

    所以你可以这样做:

    string json = @"{
      ""Name"": ""Apple"",
      ""Expiry"": "2008-12-28T00:00:00",
      ""Price"": 3.99,
      ""Sizes"": [
        ""Small"",
        ""Medium"",
        ""Large""
      ]
    }";
    
    JObject o = JObject.Parse(json);
    
    string name = (string)o["Name"];
    
    // Apple
    JArray sizes = (JArray)o["Sizes"];
    string smallest = (string)sizes[0];
    
    // Small
    

    注意:- 此代码已从项目站点上的示例中复制 http://james.newtonking.com/pages/json-net.aspx

    【讨论】:

    • 您的示例中的 LINQ 在哪里?
    • @MichaëlHompus 为什么这里有人需要 LINQ?
    • 好吧,看看问题的标题? :)
    • 附注:JObject、JArray 和 JToken 位于 Newtonsoft.Json.Linq 命名空间中。
    【解决方案3】:

    在绑定中,您始终可以反序列化 JSON 并将其序列化为 XML,然后将 XML 加载到 XDocument 中。然后您可以使用经典的 Linq to XML。完成后获取 XML,对其进行反序列化,然后将其序列化回 JSON 到 JSON。我们使用这种技术将 JSON 支持添加到最初为 XML 构建的应用程序中,它允许几乎为零的修改来启动和运行。

    【讨论】:

      【解决方案4】:

      您可以像这样使用 LINQ 轻松查询

      考虑到这个 JSON

      {
          "items": [
              {
                  "id": "10",
                  "name": "one"
              },
              {
                  "id": "12",
                  "name": "two"
              }
          ]
      }
      

      让我们像这样把它放在一个名为json的变量中,

      JObject json = JObject.Parse("{'items':[{'id':'10','name':'one'},{'id':'12','name':'two'}]}");
      

      您可以使用以下 LINQ 查询从名称为 "one" 的项目中选择所有 ID

      var Ids =
          from item in json["items"]
          where (string)item["name"] == "one"
          select item["id"];
      

      然后,您将在 IEnumerable 列表中获得结果

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-26
        • 1970-01-01
        相关资源
        最近更新 更多