es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  ,

Answer

  1. Avatar for 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:

    {% set cart = contact.json_field | json_decode %}
    
    Entidad  : {{ cart.tokens.entity_id | raw }}
    
    {% for i in range(0, 3) %}
    Nombre del elemento : {{ cart.tokens['item[' ~ i ~ '].name'] | raw }}
    {% endfor %}
    

    Explicación:

    1. Primero, decodifica la carga útil JSON utilizando json_decode.
    2. Luego, imprimes el ID de entidad usando cart.tokens.entity_id.
    3. A continuación, recorres el rango de índices (0 a 3) y utilizas el operador ~ para concatenar el índice con las cadenas circundantes y crear la cadena de clave correcta: 'item[' ~ i ~ '].name'.
    4. Finalmente, imprimes el nombre del elemento utilizando 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 bucle for normal. Sin embargo, puede utilizar la función range para generar los índices y concatenarlos con las cadenas circundantes para crear las claves correctas.

Comments are closed.