Search code examples
c#json

Get values from a JSON with condition and convert it to a list of object


With my code below I am able to get the value of:

{
  "101": [
    {
      "name": "Lane 2",
      "code": 21
    },
    {
      "name": "Lane 4",
      "code": 41
    },
    {
      "name": "Lane 6",
      "code": 61
    },
    {
      "name": "Lane 8",
      "code": 81
    },
    {
      "name": "Lane 9",
      "code": 91
    },
    {
      "name": "Lane 11",
      "code": 111
    }
  ],
  "103": [
     {
      "name": "Lane 3",
      "code": 31
    },
    {
      "name": "Lane 6",
      "code": 61
    }
  ],
  "105": [
     {
      "name": "Lane 6",
      "code": 61
    },
    {
      "name": "Lane 9",
      "code": 91
    }
  ],
  "107": [
     {
      "name": "Lane 3",
      "code": 31
    },
    {
      "name": "Lane 5",
      "code": 51
    }
  ],
  "109": [
     {
      "name": "Lane 3",
      "code": 31
    },
    {
      "name": "Lane 5",
      "code": 61
    }
  ],
  "111": [
     {
      "name": "Lane 2",
      "code": 21
    },
    {
      "name": "Lane 4",
      "code": 41
    },
    {
      "name": "Lane 6",
      "code": 61
    }
  ],
  "113": [
     {
      "name": "Lane 4",
      "code": 41
    },
    {
      "name": "Lane 6",
      "code": 61
    },
    {
      "name": "Lane 8",
      "code": 81
    },
    {
      "name": "Lane 9",
      "code": 91
    }
  ],
  "115": [
     {
      "name": "Lane 3",
      "code": 31
    },
    {
      "name": "Lane 5",
      "code": 51
    }
  ],
  "117": [
     {
      "name": "Lane 3",
      "code": 31
    },
    {
      "name": "Lane 4",
      "code": 41
    },
    {
      "name": "Lane 6",
      "code": 61
    }
  ]
}

What I need is to be able to select through the json file for a certain value then get its children. Example when I send "101" I should be able to get:

    {
      "name": "Lane 2",
      "code": 21
    },
    {
      "name": "Lane 4",
      "code": 41
    },
    {
      "name": "Lane 6",
      "code": 61
    },
    {
      "name": "Lane 8",
      "code": 81
    },
    {
      "name": "Lane 9",
      "code": 91
    },
    {
      "name": "Lane 11",
      "code": 111
    }

and place it on a class. This is my code so far:

Lane.json

{
  "101": [
    {
      "name": "Lane 2",
      "code": 21
    }
    {
      "name": "Lane 4",
      "code": 41
    },
    {
      "name": "Lane 6",
      "code": 61
    },
    {
      "name": "Lane 8",
      "code": 81
    },
    {
      "name": "Lane 9",
      "code": 91
    },
    {
      "name": "Lane 11",
      "code": 111
    }
  ],
  "103": [
     {
      "name": "Lane 3",
      "code": 31
    },
    {
      "name": "Lane 6",
      "code": 61
    }
  ],
  "105": [
     {
      "name": "Lane 6",
      "code": 61
    },
    {
      "name": "Lane 9",
      "code": 91
    }
  ],
  "107": [
     {
      "name": "Lane 3",
      "code": 31
    },
    {
      "name": "Lane 5",
      "code": 51
    }
  ],
  "109": [
     {
      "name": "Lane 3",
      "code": 31
    },
    {
      "name": "Lane 5",
      "code": 61
    }
  ],
  "111": [
     {
      "name": "Lane 2",
      "code": 21
    },
    {
      "name": "Lane 4",
      "code": 41
    },
    {
      "name": "Lane 6",
      "code": 61
    }
  ],
  "113": [
     {
      "name": "Lane 4",
      "code": 41
    },
    {
      "name": "Lane 6",
      "code": 61
    },
    {
      "name": "Lane 8",
      "code": 81
    },
    {
      "name": "Lane 9",
      "code": 91
    }
  ],
  "115": [
     {
      "name": "Lane 3",
      "code": 31
    },
    {
      "name": "Lane 5",
      "code": 51
    }
  ],
  "117": [
     {
      "name": "Lane 3",
      "code": 31
    },
    {
      "name": "Lane 4",
      "code": 41
    },
    {
      "name": "Lane 6",
      "code": 61
    }
  ]
}

Lane.cs

class Lane
{
    public string name { get; set; }
    public int code { get; set; }
}

class LaneContainer
{
    public List<Lane> Lane { get; set; }
}

This is how I get the values

private void cbPlaza_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    Plaza selected = (Plaza)cbPlaza.SelectedValue;

    string fileName = "Lane.json";
    string path = System.IO.Path.Combine(Environment.CurrentDirectory, @"Data\", fileName);
    var json = File.ReadAllText(path);

    LaneContainer laneContainer = JsonConvert.DeserializeObject<LaneContainer>(File.ReadAllText(json));
}

I get an error like so:

Additional information: After parsing a value an unexpected character was encountered: {. Path '101[0]', line 7, position 4.

What can I do to solve this?


Solution

  • You are missing a comma and your structure is a Dictionary<string,List<Lane>>

      class Lane
      {
         public string name { get; set; }
         public int code { get; set; }
      }
    

    Example

    To get 101

    var json = File.ReadAllText(path);
    
    var lanes = JsonConvert.DeserializeObject<Dictionary<string, List<Lane>>>(json);
    var results = lanes["101"];