To solve Cindy's juice problem, we need to convert the natural language description into a symbolic representation and then translate it into Gurobi code. Here is the solution:

```json
{
  'sym_variables': [('x1', 'glasses of orange juice'), ('x2', 'glasses of apple juice')],
  'objective_function': 'minimize 7*x1 + x2',
  'constraints': [
    '2*x1 + 5*x2 >= 30', 
    '3*x1 + 5*x2 >= 40', 
    '5*x1 + 2*x2 <= 50'
  ]
}
```

The reasoning behind this conversion is as follows:

- We define two variables, `x1` and `x2`, to represent the number of glasses of orange juice and apple juice that Cindy should drink.
- The objective function aims to minimize the total amount of Glycine consumed. Since a glass of orange juice contains 7 units of Glycine and a glass of apple juice contains 1 unit, we can express this as `minimize 7*x1 + x2`.
- We have three constraints based on Cindy's requirements:
  - She needs at least 30 units of Lysine: `2*x1 + 5*x2 >= 30`
  - She needs at least 40 units of Alanine: `3*x1 + 5*x2 >= 40`
  - She can have at most 50 units of Methionine: `5*x1 + 2*x2 <= 50`

Now, we translate this symbolic representation into Gurobi code in Python:

```python
from gurobipy import *

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

# Define the variables
x1 = m.addVar(vtype=GRB.CONTINUOUS, name="orange_juice")
x2 = m.addVar(vtype=GRB.CONTINUOUS, name="apple_juice")

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

# Add the constraints
m.addConstr(2*x1 + 5*x2 >= 30, "lysine_constraint")
m.addConstr(3*x1 + 5*x2 >= 40, "alanine_constraint")
m.addConstr(5*x1 + 2*x2 <= 50, "methionine_constraint")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Orange juice: {x1.x} glasses")
    print(f"Apple juice: {x2.x} glasses")
else:
    print("No optimal solution found")
```