## Step 1: Define the symbolic representation of the problem

Let's define the symbolic variables:
- $x_1$ represents the number of easy questions worth 4 points each.
- $x_2$ represents the number of hard questions worth 10 points each.

The objective function to maximize points is: $4x_1 + 10x_2$.

The constraints based on the problem description are:
1. $x_1 \geq 4$ (at least 4 easy questions)
2. $x_2 \geq 2$ (at least 2 hard questions)
3. $x_1 \leq 12$ (at most 12 easy questions)
4. $x_2 \leq 4$ (at most 4 hard questions)
5. $x_1 + x_2 \leq 9$ (at most 9 questions in total)

## Step 2: Convert the symbolic representation into a Gurobi code

To solve this linear programming problem using Gurobi, we will use the Gurobi Python API.

```python
import gurobi

# Create a new model
model = gurobi.Model()

# Define the variables
x1 = model.addVar(lb=0, ub=12, name="easy_questions")  # At most 12 easy questions
x2 = model.addVar(lb=0, ub=4, name="hard_questions")   # At most 4 hard questions

# Objective function: maximize 4x1 + 10x2
model.setObjective(4 * x1 + 10 * x2, gurobi.GRB.MAXIMIZE)

# Constraints
model.addConstr(x1 >= 4, name="min_easy")  # At least 4 easy questions
model.addConstr(x2 >= 2, name="min_hard")  # At least 2 hard questions
model.addConstr(x1 + x2 <= 9, name="total_questions")  # At most 9 questions

# Update model
model.update()

# Solve the model
model.optimize()

# Print the solution
if model.status == gurobi.GRB.OPTIMAL:
    print("Optimal solution:")
    print(f"Easy questions: {x1.varValue}")
    print(f"Hard questions: {x2.varValue}")
    print(f"Max points: {4 * x1.varValue + 10 * x2.varValue}")
else:
    print("No optimal solution found")
```

## Step 3: Provide the symbolic representation in JSON format

```json
{
    "sym_variables": [
        ["x1", "easy questions"],
        ["x2", "hard questions"]
    ],
    "objective_function": "4x1 + 10x2",
    "constraints": [
        "x1 >= 4",
        "x2 >= 2",
        "x1 <= 12",
        "x2 <= 4",
        "x1 + x2 <= 9"
    ]
}
```

The final answer is: 
```python
import gurobi

# Create a new model
model = gurobi.Model()

# Define the variables
x1 = model.addVar(lb=4, ub=12, name="easy_questions")  # At least 4, at most 12 easy questions
x2 = model.addVar(lb=2, ub=4, name="hard_questions")   # At least 2, at most 4 hard questions

# Objective function: maximize 4x1 + 10x2
model.setObjective(4 * x1 + 10 * x2, gurobi.GRB.MAXIMIZE)

# Constraints
model.addConstr(x1 + x2 <= 9, name="total_questions")  # At most 9 questions

# Update model
model.update()

# Solve the model
model.optimize()

# Print the solution
if model.status == gurobi.GRB.OPTIMAL:
    print("Optimal solution:")
    print(f"Easy questions: {x1.varValue}")
    print(f"Hard questions: {x2.varValue}")
    print(f"Max points: {4 * x1.varValue + 10 * x2.varValue}")
else:
    print("No optimal solution found")
```