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

Let's define the symbolic variables:
- $x_1$ represents the number of small cabinets
- $x_2$ represents the number of large cabinets

The objective is to maximize the total number of seasonings and spices that can be stored. Given that a small cabinet can hold 30 seasonings and spices and a large cabinet can hold 40, the objective function can be represented as:
\[ \text{Maximize:} \quad 30x_1 + 40x_2 \]

## Step 2: Define the constraints

The constraints based on the problem description are:
1. Space constraint: A small cabinet takes 4 sq ft of space and a large cabinet takes 8 sq ft, with 200 sq ft available.
\[ 4x_1 + 8x_2 \leq 200 \]
2. Budget constraint: A small cabinet costs $70 and a large cabinet costs $120, with a budget of $1400.
\[ 70x_1 + 120x_2 \leq 1400 \]
3. Non-negativity constraint: The number of cabinets cannot be negative.
\[ x_1 \geq 0, x_2 \geq 0 \]
4. Integer constraint: The number of cabinets must be an integer.
\[ x_1 \in \mathbb{Z}, x_2 \in \mathbb{Z} \]

## 3: Symbolic representation in JSON format

```json
{
'sym_variables': [('x1', 'small cabinets'), ('x2', 'large cabinets')],
'objective_function': '30*x1 + 40*x2',
'constraints': [
    '4*x1 + 8*x2 <= 200',
    '70*x1 + 120*x2 <= 1400',
    'x1 >= 0',
    'x2 >= 0'
]
}
```

## 4: Gurobi code in Python

```python
import gurobi

def solve_cabinet_problem():
    # Create a new model
    model = gurobi.Model()

    # Define the variables
    x1 = model.addVar(name="small_cabinets", vtype=gurobi.GRB.INTEGER)
    x2 = model.addVar(name="large_cabinets", vtype=gurobi.GRB.INTEGER)

    # Objective function: Maximize 30*x1 + 40*x2
    model.setObjective(30*x1 + 40*x2, gurobi.GRB.MAXIMIZE)

    # Constraints
    model.addConstr(4*x1 + 8*x2 <= 200, name="space_constraint")
    model.addConstr(70*x1 + 120*x2 <= 1400, name="budget_constraint")
    model.addConstr(x1 >= 0, name="x1_nonneg")
    model.addConstr(x2 >= 0, name="x2_nonneg")

    # Optimize the model
    model.optimize()

    # Print the results
    if model.status == gurobi.GRB.OPTIMAL:
        print("Optimal solution found.")
        print(f"Number of small cabinets: {x1.varValue}")
        print(f"Number of large cabinets: {x2.varValue}")
        print(f"Total seasonings and spices: {30*x1.varValue + 40*x2.varValue}")
    else:
        print("No optimal solution found.")

solve_cabinet_problem()
```