1

我有一个 MVC 3 Web 应用程序并返回一个 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
    }
   }]
}
}

……

例如,我需要返回或获取名称为“设置”的 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"] };

当我运行它时,我的结果一无所获。谁能帮助并告诉我我做错了什么?

谢谢。

4

1 回答 1

2

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

我尝试了一个在线解析器,解析只得到了第三个结果......(尝试在左侧窗口中复制您的代码,并查看 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();
于 2012-10-10T14:20:52.290 回答