To convert the given natural language description into a symbolic representation and subsequently into Gurobi code, we first identify the variables, objective function, and constraints as described.

### Symbolic Representation:

- Let `x0` represent the number of CBRN platoons.
- Let `x1` represent the number of mechanized infantry companies.
- Let `x2` represent the number of water purification units.

The objective function is to minimize: `8*x0 + 7*x1 + 4*x2`.

Constraints:
1. Mobility rating from mechanized infantry companies and water purification units must be at least 32: `11*x1 + 18*x2 >= 32`.
2. Total mobility rating from CBRN platoons plus mechanized infantry companies should be at least 24: `7*x0 + 11*x1 >= 24`.
3. Total mobility rating from all units must be at least 24: `7*x0 + 11*x1 + 18*x2 >= 24`.
4. Total offensive capability rating from mechanized infantry companies plus water purification units must be at least 26: `18*x1 + 3*x2 >= 26`.
5. Total offensive capability rating from CBRN platoons and mechanized infantry companies should be at least 12: `1*x0 + 18*x1 >= 12`.
6. Total offensive capability rating from all units must be at least 12: `1*x0 + 18*x1 + 3*x2 >= 12`.
7. Total mobility rating from all units should not exceed 49: `7*x0 + 11*x1 + 18*x2 <= 49`.

All variables are integers.

### Symbolic Representation in JSON Format:

```json
{
    'sym_variables': [('x0', 'CBRN platoons'), ('x1', 'mechanized infantry companies'), ('x2', 'water purification units')],
    'objective_function': '8*x0 + 7*x1 + 4*x2',
    'constraints': [
        '11*x1 + 18*x2 >= 32',
        '7*x0 + 11*x1 >= 24',
        '7*x0 + 11*x1 + 18*x2 >= 24',
        '18*x1 + 3*x2 >= 26',
        '1*x0 + 18*x1 >= 12',
        '1*x0 + 18*x1 + 3*x2 >= 12',
        '7*x0 + 11*x1 + 18*x2 <= 49'
    ]
}
```

### Gurobi Code:

```python
from gurobipy import *

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

# Define variables
x0 = m.addVar(vtype=GRB.INTEGER, name="CBRN_platoons")
x1 = m.addVar(vtype=GRB.INTEGER, name="mechanized_infantry_companies")
x2 = m.addVar(vtype=GRB.INTEGER, name="water_purification_units")

# Set the objective function
m.setObjective(8*x0 + 7*x1 + 4*x2, GRB.MINIMIZE)

# Add constraints
m.addConstr(11*x1 + 18*x2 >= 32, "mobility_rating_min_1")
m.addConstr(7*x0 + 11*x1 >= 24, "total_mobility_rating_min_1")
m.addConstr(7*x0 + 11*x1 + 18*x2 >= 24, "total_mobility_rating_min_all")
m.addConstr(18*x1 + 3*x2 >= 26, "offensive_capability_rating_min_1")
m.addConstr(1*x0 + 18*x1 >= 12, "offensive_capability_rating_min_2")
m.addConstr(1*x0 + 18*x1 + 3*x2 >= 12, "total_offensive_capability_rating_min_all")
m.addConstr(7*x0 + 11*x1 + 18*x2 <= 49, "total_mobility_rating_max")

# Optimize the model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"CBRN platoons: {x0.x}")
    print(f"Mechanized infantry companies: {x1.x}")
    print(f"Water purification units: {x2.x}")
else:
    print("No optimal solution found")
```