```json
{
  "sym_variables": [
    ("x0", "chicken drumsticks"),
    ("x1", "bowls of pasta"),
    ("x2", "corn cobs"),
    ("x3", "black beans")
  ],
  "objective_function": "7*x0 + 5*x1 + 7*x2 + 4*x3",
  "constraints": [
    "19*x0 + 16*x3 >= 56",
    "19*x0 + 4*x2 >= 38",
    "4*x1 + 4*x2 >= 36",
    "19*x0 + 4*x1 + 4*x2 >= 53",
    "19*x0 + 4*x2 + 16*x3 >= 53",
    "4*x1 + 4*x2 + 16*x3 >= 53",
    "19*x0 + 4*x1 + 4*x2 >= 66",
    "19*x0 + 4*x2 + 16*x3 >= 66",
    "4*x1 + 4*x2 + 16*x3 >= 66",
    "19*x0 + 4*x1 + 4*x2 >= 62",
    "19*x0 + 4*x2 + 16*x3 >= 62",
    "4*x1 + 4*x2 + 16*x3 >= 62",
    "12*x0 + 10*x1 >= 58",
    "12*x0 + 10*x1 + 4*x3 >= 86",
    "12*x0 + 22*x2 + 4*x3 >= 86",
    "12*x0 + 10*x1 + 4*x3 >= 98",
    "12*x0 + 22*x2 + 4*x3 >= 98",
    "19*x0 + 4*x1 <= 159",
    "4*x1 + 16*x3 <= 176",
    "4*x1 + 4*x2 <= 159",
    "19*x0 + 4*x1 + 4*x2 <= 302",
    "4*x1 + 4*x2 + 16*x3 <= 141",
    "19*x0 + 4*x1 + 16*x3 <= 328",
    "19*x0 + 4*x1 + 4*x2 + 16*x3 <= 328",
    "12*x0 + 22*x2 <= 328",
    "10*x1 + 4*x3 <= 435",
    "12*x0 + 10*x1 + 22*x2 + 4*x3 <= 435",
    "x0 >= 0",
    "x1 >= 0",
    "x2 >= 0",
    "x3 >= 0",
    "x2 == int"  
  ]
}
```

```python
import gurobipy as gp

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

    # Create variables
    chicken = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="chicken")
    pasta = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="pasta")
    corn = m.addVar(lb=0, vtype=gp.GRB.INTEGER, name="corn")
    beans = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="beans")


    # Set objective function
    m.setObjective(7*chicken + 5*pasta + 7*corn + 4*beans, gp.GRB.MAXIMIZE)

    # Add constraints
    m.addConstr(19*chicken + 16*beans >= 56)
    m.addConstr(19*chicken + 4*corn >= 38)
    m.addConstr(4*pasta + 4*corn >= 36)
    m.addConstr(19*chicken + 4*pasta + 4*corn >= 53)
    m.addConstr(19*chicken + 4*corn + 16*beans >= 53)
    m.addConstr(4*pasta + 4*corn + 16*beans >= 53)
    m.addConstr(19*chicken + 4*pasta + 4*corn >= 66)
    m.addConstr(19*chicken + 4*corn + 16*beans >= 66)
    m.addConstr(4*pasta + 4*corn + 16*beans >= 66)
    m.addConstr(19*chicken + 4*pasta + 4*corn >= 62)
    m.addConstr(19*chicken + 4*corn + 16*beans >= 62)
    m.addConstr(4*pasta + 4*corn + 16*beans >= 62)
    m.addConstr(12*chicken + 10*pasta >= 58)
    m.addConstr(12*chicken + 10*pasta + 4*beans >= 86)
    m.addConstr(12*chicken + 22*corn + 4*beans >= 86)
    m.addConstr(12*chicken + 10*pasta + 4*beans >= 98)
    m.addConstr(12*chicken + 22*corn + 4*beans >= 98)
    m.addConstr(19*chicken + 4*pasta <= 159)
    m.addConstr(4*pasta + 16*beans <= 176)
    m.addConstr(4*pasta + 4*corn <= 159)
    m.addConstr(19*chicken + 4*pasta + 4*corn <= 302)
    m.addConstr(4*pasta + 4*corn + 16*beans <= 141)
    m.addConstr(19*chicken + 4*pasta + 16*beans <= 328)
    m.addConstr(19*chicken + 4*pasta + 4*corn + 16*beans <= 328)
    m.addConstr(12*chicken + 22*corn <= 328)
    m.addConstr(10*pasta + 4*beans <= 435)
    m.addConstr(12*chicken + 10*pasta + 22*corn + 4*beans <= 435)


    # Optimize model
    m.optimize()

    if m.status == gp.GRB.OPTIMAL:
        print(f"Optimal objective value: {m.objVal}")
        print("Optimal solution:")
        print(f"  Chicken Drumsticks: {chicken.x}")
        print(f"  Bowls of Pasta: {pasta.x}")
        print(f"  Corn Cobs: {corn.x}")
        print(f"  Black Beans: {beans.x}")
    elif m.status == gp.GRB.INFEASIBLE:
        print("The model is infeasible.")
    else:
        print(f"Optimization terminated with status {m.status}")


except gp.GurobiError as e:
    print(f"Error code {e.errno}: {e}")

except AttributeError:
    print('Encountered an attribute error')
```