To solve the given optimization problem, we first need to convert the natural language description into a symbolic representation. This involves defining variables for each type of ad and then formulating the objective function and constraints using these variables.

Let's define the following variables:
- $x_1$: Number of newspaper ads
- $x_2$: Number of radio ads
- $x_3$: Number of television ads

The objective is to maximize the total number of viewers. Given that a newspaper ad attracts 5000 viewers, a radio ad attracts 1000 viewers, and a television ad attracts 8000 viewers, the objective function can be written as:
\[ \text{Maximize: } 5000x_1 + 1000x_2 + 8000x_3 \]

The constraints are as follows:
1. The weekly budget is $100000. Given that a newspaper ad costs $1200, a radio ad costs $500, and a television ad costs $2000, we have:
\[ 1200x_1 + 500x_2 + 2000x_3 \leq 100000 \]
2. The number of radio ads is limited to 10:
\[ x_2 \leq 10 \]
3. At most a third of the total number of ads should be television ads:
\[ x_3 \leq \frac{1}{3}(x_1 + x_2 + x_3) \]
4. At least 20% of the ads should be newspaper ads:
\[ x_1 \geq 0.20(x_1 + x_2 + x_3) \]

All variables $x_1, x_2, x_3$ must be non-negative integers since they represent the number of ads.

The symbolic representation in JSON format is:

```json
{
    'sym_variables': [('x1', 'number of newspaper ads'), ('x2', 'number of radio ads'), ('x3', 'number of television ads')],
    'objective_function': '5000*x1 + 1000*x2 + 8000*x3',
    'constraints': [
        '1200*x1 + 500*x2 + 2000*x3 <= 100000',
        'x2 <= 10',
        'x3 <= (1/3)*(x1 + x2 + x3)',
        'x1 >= 0.20*(x1 + x2 + x3)'
    ]
}
```

Now, let's write the Gurobi code in Python to solve this optimization problem:

```python
from gurobipy import *

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

# Define variables
x1 = m.addVar(vtype=GRB.INTEGER, name="newspaper_ads")
x2 = m.addVar(vtype=GRB.INTEGER, name="radio_ads")
x3 = m.addVar(vtype=GRB.INTEGER, name="television_ads")

# Set objective function
m.setObjective(5000*x1 + 1000*x2 + 8000*x3, GRB.MAXIMIZE)

# Add constraints
m.addConstr(1200*x1 + 500*x2 + 2000*x3 <= 100000, "budget_constraint")
m.addConstr(x2 <= 10, "radio_ads_limit")
m.addConstr(x3 <= (1/3)*(x1 + x2 + x3), "television_ads_limit")
m.addConstr(x1 >= 0.20*(x1 + x2 + x3), "newspaper_ads_minimum")

# Optimize model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Newspaper Ads: {x1.x}")
    print(f"Radio Ads: {x2.x}")
    print(f"Television Ads: {x3.x}")
else:
    print("No optimal solution found")
```