To solve the optimization problem described, we first need to translate the natural language description into a symbolic representation. This involves defining the variables, the objective function, and the constraints using mathematical notation.

Let's denote:
- $x_1$ as the number of air defense batteries,
- $x_2$ as the number of artillery batteries.

The objective function to maximize is given by: 
\[7(x_1)^2 + 6(x_1)(x_2) + 6(x_2)^2 + 3(x_2)\]

The constraints are:
1. Defensive capability rating of air defense batteries: $12x_1$
2. Deployment weight of air defense batteries: $12x_1$
3. Defensive capability rating of artillery batteries: $18x_2$
4. Deployment weight of artillery batteries: $x_2$
5. Total combined defensive capability rating from both types of batteries squared should be at least 55: $(12x_1 + 18x_2)^2 \geq 55$
6. The deployment weight of air defense and artillery batteries squared must be at least 21 metric tons: $(12x_1 + x_2)^2 \geq 21$
7. $-5(x_1)^2 + 9(x_2)^2 \geq 0$
8. Total combined defensive capability rating from both types of batteries squared should be no more than 90: $(12x_1 + 18x_2)^2 \leq 90$
9. Total combined defensive capability rating from air defense and artillery batteries must be less than or equal to 90: $12x_1 + 18x_2 \leq 90$
10. Total deployment weight of both types of batteries must not exceed 76 metric tons: $12x_1 + x_2 \leq 76$
11. Both $x_1$ and $x_2$ must be integers.

Given this, the symbolic representation in JSON format is:
```json
{
    'sym_variables': [('x1', 'air defense batteries'), ('x2', 'artillery batteries')],
    'objective_function': '7*(x1)**2 + 6*x1*x2 + 6*(x2)**2 + 3*x2',
    'constraints': [
        '(12*x1 + 18*x2)**2 >= 55',
        '(12*x1 + x2)**2 >= 21',
        '-5*(x1)**2 + 9*(x2)**2 >= 0',
        '(12*x1 + 18*x2)**2 <= 90',
        '12*x1 + 18*x2 <= 90',
        '12*x1 + x2 <= 76',
        'x1 == int(x1)',
        'x2 == int(x2)'
    ]
}
```

Now, let's write the Gurobi code to solve this optimization problem:
```python
from gurobipy import *

# Create a new model
m = Model("Optimization_Problem")

# Define variables
x1 = m.addVar(vtype=GRB.INTEGER, name="air_defense_batteries")
x2 = m.addVar(vtype=GRB.INTEGER, name="artillery_batteries")

# Set objective function
m.setObjective(7*x1**2 + 6*x1*x2 + 6*x2**2 + 3*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr((12*x1 + 18*x2)**2 >= 55, name="defensive_capability_min")
m.addConstr((12*x1 + x2)**2 >= 21, name="deployment_weight_min_squared")
m.addConstr(-5*x1**2 + 9*x2**2 >= 0, name="mixed_constraint")
m.addConstr((12*x1 + 18*x2)**2 <= 90, name="defensive_capability_max_squared")
m.addConstr(12*x1 + 18*x2 <= 90, name="defensive_capability_max")
m.addConstr(12*x1 + x2 <= 76, name="deployment_weight_max")

# Optimize model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print("Air Defense Batteries:", x1.x)
    print("Artillery Batteries:", x2.x)
    print("Objective Function Value:", m.objVal)
else:
    print("No optimal solution found")
```