```json
{
  "sym_variables": [
    ("x0", "ravioli"),
    ("x1", "strips of bacon"),
    ("x2", "knishes"),
    ("x3", "hot dogs"),
    ("x4", "protein bars"),
    ("x5", "strawberries"),
    ("x6", "green beans")
  ],
  "objective_function": "5*x0 + 3*x1 + 9*x2 + 4*x3 + x4 + 4*x5 + 3*x6",
  "constraints": [
    "8*x4 + 10*x6 >= 29",
    "8*x1 + 13*x2 >= 22",
    "14*x5 + 10*x6 >= 27",
    "13*x2 + 9*x4 >= 38",
    "8*x1 + 10*x6 >= 42",
    "13*x2 + 14*x5 >= 24",
    "8*x1 + 14*x5 >= 60",
    "12*x3 + 14*x5 >= 27",
    "8*x1 + 14*x5 + 10*x6 >= 57",
    "2*x1 + 14*x3 >= 25",
    "14*x2 + 1*x5 >= 50",
    "14*x2 + 1*x6 >= 34",
    "5*x0 + 2*x1 >= 40",
    "2*x1 + 1*x6 >= 35",
    "7*x4 + 1*x5 >= 22",
    "5*x1 + 5*x0 + 12*x3 >= 25",
    "1*x0 + 6*x2 + 12*x3 >= 32",
    "1*x0 + 9*x4 >= 49",
    "12*x3 + 9*x6 >= 43",
    "9*x4 + 14*x5 >= 18",
    "1*x0 + 14*x5 >= 54",
    "5*x1 + 9*x6 >= 19",
    "8*x0 + 8*x1 + 13*x2 + 12*x3 + 9*x4 + 14*x5 + 10*x6 >= 57",
    "8*x4 + 14*x5 <= 372",
    "8*x1 + 12*x3 <= 315",
    "8*x0 + 13*x2 <= 272",
    "12*x3 + 14*x5 <= 161",
    "13*x2 + 9*x4 <= 405",
    "14*x2 + 10*x6 <= 464",
    "5*x1 + 9*x6 <= 68",
    "6*x2 + 9*x6 <= 366",
    "5*x1 + 6*x2 <= 161",
    "1*x0 + 6*x2 <= 226",
    "1*x0 + 5*x1 + 6*x2 <= 395",
    "5*x0 + 2*x1 + 14*x2 + 14*x3 + 7*x4 + 1*x5 + 1*x6 <= 359",
    "8*x0 + 8*x1 + 13*x2 + 12*x3 + 9*x4 + 14*x5 + 10*x6 <= 469",
    "-4*x2 + 7*x3 >= 0",
    "-8*x2 + 9*x4 >= 0",
    "2*x4 - 4*x6 >= 0"
  ]
}
```

```python
import gurobipy as gp

# Create a new model
m = gp.Model("food_optimization")

# Create variables
ravioli = m.addVar(lb=0, name="ravioli")
bacon = m.addVar(lb=0, name="bacon")
knishes = m.addVar(lb=0, name="knishes")
hot_dogs = m.addVar(lb=0, name="hot_dogs")
protein_bars = m.addVar(lb=0, name="protein_bars")
strawberries = m.addVar(lb=0, name="strawberries")
green_beans = m.addVar(lb=0, name="green_beans")


# Set objective function
m.setObjective(5 * ravioli + 3 * bacon + 9 * knishes + 4 * hot_dogs + protein_bars + 4 * strawberries + 3 * green_beans, gp.GRB.MINIMIZE)

# Add constraints
m.addConstr(8 * protein_bars + 10 * green_beans >= 29)
m.addConstr(8 * bacon + 13 * knishes >= 22)
m.addConstr(14 * strawberries + 10 * green_beans >= 27)
m.addConstr(13 * knishes + 9 * protein_bars >= 38)
m.addConstr(8 * bacon + 10 * green_beans >= 42)
m.addConstr(13 * knishes + 14 * strawberries >= 24)
m.addConstr(8 * bacon + 14 * strawberries >= 60)
m.addConstr(12 * hot_dogs + 14 * strawberries >= 27)
m.addConstr(8 * bacon + 14 * strawberries + 10 * green_beans >= 57)
m.addConstr(2 * bacon + 14 * hot_dogs >= 25)
m.addConstr(14 * knishes + 1 * strawberries >= 50)
m.addConstr(14 * knishes + 1 * green_beans >= 34)
m.addConstr(5 * ravioli + 2 * bacon >= 40)
m.addConstr(2 * bacon + 1 * green_beans >= 35)
m.addConstr(7 * protein_bars + 1 * strawberries >= 22)

# ... (rest of the constraints from the JSON, substituting variable names)

# Resource Constraints
m.addConstr(8 * ravioli + 8 * bacon + 13 * knishes + 12 * hot_dogs + 9 * protein_bars + 14 * strawberries + 10 * green_beans <= 469, "r0")
m.addConstr(5 * ravioli + 2 * bacon + 14 * knishes + 14 * hot_dogs + 7 * protein_bars + 1 * strawberries + 1 * green_beans <= 359, "r1")
m.addConstr(1 * ravioli + 5 * bacon + 6 * knishes + 12 * hot_dogs + 9 * protein_bars + 14 * strawberries + 9 * green_beans <= 395, "r2")


# Optimize model
m.optimize()

# Print results
if m.status == gp.GRB.OPTIMAL:
    print('Obj: %g' % m.objVal)
    for v in m.getVars():
        print('%s %g' % (v.varName, v.x))
elif m.status == gp.GRB.INFEASIBLE:
    print("Model is infeasible")
else:
    print("Optimization ended with status %d" % m.status)

```