using System.Collections.Generic;
using Newtonsoft.Json.Linq;
public class JsonQueryExecutor
private readonly JObject jsonObject;
public JsonQueryExecutor(JObject jsonObject)
this.jsonObject = jsonObject;
public object ExecuteQuery(string query)
string[] queryParts = query.Split(' ');
if (queryParts.Length < 4 || !queryParts[0].Equals("select", StringComparison.OrdinalIgnoreCase))
throw new ArgumentException("Invalid query format");
string selectClause = queryParts[1];
string fromClause = queryParts[3];
JToken table = jsonObject.SelectToken(fromClause);
throw new ArgumentException($"Table '{fromClause}' not found in the JSON object");
switch (selectClause.ToLower())
return ExecuteCountQuery(table, queryParts);
return ExecuteSelectQuery(table, selectClause, queryParts);
private int ExecuteCountQuery(JToken table, string[] queryParts)
if (queryParts.Length != 8 || !queryParts[4].Equals("where", StringComparison.OrdinalIgnoreCase))
throw new ArgumentException("Invalid count query format");
string conditionClause = queryParts[5] + " " + queryParts[6] + " " + queryParts[7];
IEnumerable<JToken> filteredRows = table.Where(row => EvaluateCondition(row, conditionClause));
return filteredRows.Count();
private object ExecuteSelectQuery(JToken table, string columnName, string[] queryParts)
if (queryParts.Length != 8 || !queryParts[4].Equals("where", StringComparison.OrdinalIgnoreCase))
throw new ArgumentException("Invalid select query format");
string conditionClause = queryParts[5] + " " + queryParts[6] + " " + queryParts[7];
IEnumerable<JToken> filteredRows = table.Where(row => EvaluateCondition(row, conditionClause));
return filteredRows.Select(row => row[columnName]).ToList();
private bool EvaluateCondition(JToken row, string condition)
string[] conditionParts = condition.Split(' ');
if (conditionParts.Length != 3)
throw new ArgumentException("Invalid condition format");
string columnName = conditionParts[0];
string op = conditionParts[1];
string value = conditionParts[2].Trim('\'');
JToken columnValue = row[columnName];
case "==": return columnValue.ToString() == value;
case "!=": return columnValue.ToString() != value;
default: throw new ArgumentException($"Unsupported operator: {op}");
{ ""iconId"": ""i1"", ""iconType"": ""MELEE"", ""iconSlug"": ""Birbal"" },
{ ""iconId"": ""i2"", ""iconType"": ""RANGED"", ""iconSlug"": ""Tomoe"" },
{ ""iconId"": ""i3"", ""iconType"": ""RANGED"", ""iconSlug"": ""Akila"" }
JObject jsonObject = JObject.Parse(jsonString);
JsonQueryExecutor queryExecutor = new JsonQueryExecutor(jsonObject);
Console.WriteLine("Query Result 1:");
Console.WriteLine(queryExecutor.ExecuteQuery("select count(*) from icons where iconType == 'RANGED'"));
Console.WriteLine("\nQuery Result 2:");
Console.WriteLine(queryExecutor.ExecuteQuery("select iconId from icons where iconSlug == 'Tomoe'"));