Linq到Json使用Like Clause

时间:2012-10-10 12:32:52

标签: json linq

我有一个MVC 3网络应用程序并且正在返回一个JSON对象,我想使用Linq来限制返回到客户端jquery的结果。

Json响应采用以下结构:

{
  "Data": {
"Items": [
  {
    "Result": {
      "Id": "e2ba4912-c387-4f54-b55e-06742a6858db",
      "Name": "SomeOtherSetting",
      "Value": "500",
      "Archived": false
     },
    "Result": {
      "Id": "17c27584-cea8-42c2-b6c4-0b30625ac3ce",
      "Name": "Setting2",
      "Value": "600",
      "Archived": false
    },
    "Result": {
      "Id": "17c27584-cea8-42c2-b6c4-0b30625ac3ce",
      "Name": "Setting3",
      "Value": "700",
      "Archived": false
    }
   }]
}
}

...

我需要返回或抓住只有名称为'Setting'的json项目。在该示例中,这将仅返回2个Json节点。

我的Linq非常有限,我所拥有的是:设置是存储Json响应的地方。

NewtonSoft.Json.Linq.JObject data = NewtonSoft.Json.Linq.JObject.Parse(Settings);

var result = from p in data["Data"]["Items"].Children()
    where (p["Result"]["Name"].Contains("Expenses.Help.Tip"))
     select new { Name = (string)p["Result"]["Name"], Value = (string)p["Result"]["Value"] };

当我跑步时,我的结果没有任何结果。谁能帮忙告诉我我做错了什么?

感谢。

1 个答案:

答案 0 :(得分:2)

好吧,我不是Json专家,但我认为你的Json结构存在一些问题。

我尝试了online parser,解析只取得了第三个结果......(尝试复制左侧窗口中的代码,然后查看JS eval。

而不是

"Items": [
  {
    "Result": {

     },
    "Result": {

    },
    "Result": {

    }
   }]

你应该将Items数组的每个元素(每个'Result')都放入{}

"Items": [
  {
    {"Result": {

      }
    },
    {"Result": {

      }
    },
    {"Result": {

      }
   }]

我通过将您的Json文件更改为

来实现它
 {
  "Data": {
"Items": [
   {
    "Result": {
      "Id": "e2ba4912-c387-4f54-b55e-06742a6858db",
      "Name": "SomeOtherSetting",
      "Value": "500",
      "Archived": false
      }
    },
    {
     "Result": {
      "Id": "17c27584-cea8-42c2-b6c4-0b30625ac3ce",
      "Name": "Setting2",
      "Value": "600",
      "Archived": false
      }
    },
    {
     "Result": {
      "Id": "17c27584-cea8-42c2-b6c4-0b30625ac3ce",
      "Name": "Setting3",
      "Value": "700",
      "Archived": false
    }
   }]
  }
}
使用

var data = JObject.Parse(test)["Data"]["Items"].Children()
        .Where(m => m["Result"]["Name"].Value<string>().Contains("Setting"))
        .Select(m => new
                         {
                             Name = m["Result"]["Name"].Value<string>(),
                             Value = m["Result"]["Value"].Value<int>()
                         })
        .ToList();