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

Let's denote:
- $x_1$ as the number of RC drones
- $x_2$ as the number of model cars

The objective is to maximize profit, where the profit per RC drone is $50 and per model car is $90. Therefore, the objective function can be represented as:
\[ \text{Maximize:} \quad 50x_1 + 90x_2 \]

## Step 2: Define the constraints based on the given resources

The constraints are:
- Wood: $7x_1 + 4x_2 \leq 200$ (since a RC drone requires 7 units of wood and a model car requires 4 units of wood, and there are 200 units of wood available)
- Paint: $30x_1 + 20x_2 \leq 900$ (since a RC drone requires 30 units of paint and a model car requires 20 units of paint, and there are 900 units of paint available)
- Non-negativity: $x_1 \geq 0, x_2 \geq 0$ (since the number of RC drones and model cars cannot be negative)

## 3: Symbolic representation in JSON format

```json
{
    'sym_variables': [('x1', 'RC drones'), ('x2', 'model cars')],
    'objective_function': '50*x1 + 90*x2',
    'constraints': [
        '7*x1 + 4*x2 <= 200',
        '30*x1 + 20*x2 <= 900',
        'x1 >= 0',
        'x2 >= 0'
    ]
}
```

## 4: Convert the problem into Gurobi code

```python
import gurobipy as gp

# Create a new model
model = gp.Model("Toy Production")

# Define the variables
x1 = model.addVar(name="RC_drones", lb=0, vtype=gp.GRB.CONTINUOUS)
x2 = model.addVar(name="model_cars", lb=0, vtype=gp.GRB.CONTINUOUS)

# Define the objective function
model.setObjective(50*x1 + 90*x2, gp.GRB.MAXIMIZE)

# Add constraints
model.addConstr(7*x1 + 4*x2 <= 200, name="wood_constraint")
model.addConstr(30*x1 + 20*x2 <= 900, name="paint_constraint")

# Solve the model
model.optimize()

# Print the solution
if model.status == gp.GRB.OPTIMAL:
    print(f"Optimal solution: x1 = {x1.varValue}, x2 = {x2.varValue}")
    print(f"Maximum profit: ${50*x1.varValue + 90*x2.varValue:.2f}")
else:
    print("The model is infeasible.")
```