To solve this optimization problem, we first need to convert the natural language description into a symbolic representation. 

Let's denote:
- $x_1$ as the number of beef burritos sold,
- $x_2$ as the number of pork burritos sold.

The objective function, which represents the total profit, can be written as:
\[3.5x_1 + 2.1x_2\]

We aim to maximize this function.

The constraints given in the problem are:
1. The food truck can make at most 100 burritos in total: \[x_1 + x_2 \leq 100\]
2. They must sell at least 20 beef burritos: \[x_1 \geq 20\]
3. They must sell at least 30 pork burritos: \[x_2 \geq 30\]
4. They can make at most 70 beef burritos: \[x_1 \leq 70\]
5. They can make at most 80 pork burritos: \[x_2 \leq 80\]

All variables $x_1$ and $x_2$ are non-negative since they represent quantities of burritos.

The symbolic representation in JSON format is:
```json
{
    'sym_variables': [('x1', 'number of beef burritos sold'), ('x2', 'number of pork burritos sold')],
    'objective_function': '3.5*x1 + 2.1*x2',
    'constraints': ['x1 + x2 <= 100', 'x1 >= 20', 'x2 >= 30', 'x1 <= 70', 'x2 <= 80']
}
```

To solve this problem using Gurobi in Python, we will use the following code:

```python
from gurobipy import *

# Create a new model
model = Model("Burrito_Optimization")

# Create variables
x1 = model.addVar(lb=20, ub=70, vtype=GRB.INTEGER, name="beef_burritos")
x2 = model.addVar(lb=30, ub=80, vtype=GRB.INTEGER, name="pork_burritos")

# Set the objective function
model.setObjective(3.5*x1 + 2.1*x2, GRB.MAXIMIZE)

# Add constraints
model.addConstr(x1 + x2 <= 100, "total_burritos")

# Optimize model
model.optimize()

# Print solution
if model.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Beef burritos: {x1.x}")
    print(f"Pork burritos: {x2.x}")
    print(f"Total profit: {3.5*x1.x + 2.1*x2.x}")
else:
    print("No optimal solution found")
```