KDee
KDee

Reputation: 684

Linq to Json using Like Clause

I've got an MVC 3 web app and am returning a JSON object which I would like to use Linq against to limit the result returned to the client jquery.

The Json response takes the following structure:

{
  "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
    }
   }]
}
}

....

I need to return or grab just the json items that have a Name like 'Setting' for example. In the example, this would return just the 2 Json nodes.

My Linq is very limited and what I have is: Settings is where the Json response is stored.

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"] };

When I run this I get nothing in my result. Can anyone help and tell me what I'm doing wrong?

Thanks.

Upvotes: 1

Views: 1089

Answers (1)

Raphaël Althaus
Raphaël Althaus

Reputation: 60503

Well, I'm not a Json specialist, but I think your Json structure has some problems.

I tried an online parser, and parsing took only the third result... (try to copy past your code in the left window, and look at JS eval.

Instead of

"Items": [
  {
    "Result": {

     },
    "Result": {

    },
    "Result": {

    }
   }]

you should have each element of Items array (each 'Result') into {}.

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

      }
    },
    {"Result": {

      }
    },
    {"Result": {

      }
   }]

I got it to work by changing your Json file to

 {
  "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
    }
   }]
  }
}

using

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();

Upvotes: 2

Related Questions