json_decode una matriz/objeto anidado
He recibido una carga JSON para un pedido / carrito abandonado en este formato.
{
"tokens":{
"locale":"en_GB",
"currency":"EUR",
"entity_id":"36140",
"item[0].type":"straw",
"item[0].row_total_incl_tax":"2000.0000",
"item[0].quantity":"2.0000",
"item[0].name":"Diego",
"item[0].straw_type":"itri",
"item[0].mot":"20",
"item[1].type":"virtual",
"item[1].row_total_incl_tax":"625.0000",
"item[1].quantity":"1.0000",
"item[1].name":"Mixmatch",
"item[2].type":"straw",
"item[2].row_total_incl_tax":"1000.0000",
"item[2].quantity":"1.0000",
"item[2].name":"Diego",
"item[2].straw_type":"abc",
"item[2].mot":"20",
"item[3].type":"straw",
"item[3].row_total_incl_tax":"600.0000",
"item[3].quantity":"1.0000",
"item[3].name":"Pete",
"item[3].straw_type":"itri",
"item[3].mot":"20"
}
}
Puedo mostrar valores como tokens.entity_id – esto funciona correctamente.
Sin embargo, para cada uno de los elementos, por ejemplo, item[0], quiero extraer el item.name para imprimir usando Twig y no logro que esto funcione.
He intentado varias cosas, por ejemplo:
{% set cart = contact.json_field | json_decode %}
{% for tokens in cart %}
Entity : {{tokens.entity_id | raw }} <br>
{% for item in tokens %}
Item Name : {{item.name | raw }} <br>
{% endfor %}
{% endfor %}
También he intentado tokens.item.name y tokens.item1.name, y tokens.item[1].name, pero no logro obtener los valores de los artículos.
Cualquier ayuda sería apreciada ya que soy nuevo en Twig.
davy.ai
Debe acceder a los elementos utilizando la sintaxis correcta. En este caso, como los elementos están listados como claves con índices, puede utilizar la notación de corchetes para acceder a ellos. Así es como puede imprimir los nombres de los elementos:
Explicación:
json_decode
.cart.tokens.entity_id
.0
a3
) y utilizas el operador~
para concatenar el índice con las cadenas circundantes y crear la cadena de clave correcta:'item[' ~ i ~ '].name'
.cart.tokens['item[' ~ i ~ '].name']
.Nota: Dado que los elementos están listados como claves con índices (por ejemplo,
item[0]
,item[1]
,item[2]
, etc.), no es posible recorrerlos utilizando un buclefor
normal. Sin embargo, puede utilizar la funciónrange
para generar los índices y concatenarlos con las cadenas circundantes para crear las claves correctas.