Esta es mi solicitud de axios
axios({ method: 'put', url: url, data: data }).then(function (response) { console.log(response.data) }) .catch(function (error) { console.log(error) })Se está haciendo a partir de un componente vue para enviar datos de formulario (un componente de tabla).
Luego probé los siguientes objetos JSON para data
"building": { "a": ['Level 1', 0.0, 0, '', '', true], "b": ['Level 2', 3.8, 40, '', '', false], "c": ['Level 3', 7.6, 50, '', '', false], "d": ['Level 4', 11.4, 50, '', '', false] } // keys not numeric "building": { "1": ['Level 1', 0.0, 0, '', '', true], "2": ['Level 2', 3.8, 40, '', '', false], "3": ['Level 3', 7.6, 50, '', '', false], "4": ['Level 4', 11.4, 50, '', '', false] } // keys don't start at 0 "building": { "0": ['Level 1', 0.0, 0, '', '', true], "2": ['Level 2', 3.8, 40, '', '', false], "3": ['Level 3', 7.6, 50, '', '', false], "4": ['Level 4', 11.4, 50, '', '', false] } // keys not consecutive "building": { "0": ['Level 1', 0.0, 0, '', '', true], "1": ['Level 2', 3.8, 40, '', '', false], "2": ['Level 3', 7.6, 50, '', '', false], "3": ['Level 4', 11.4, 50, '', '', false] } // keys are numeric, consecutive, start at 0Los primeros 3 permanecen como objetos cuando los recibo, pero el cuarto (numérico, consecutivo, comienza en 0) se convierte en una matriz.
¿Cómo evito que esto suceda?
aclaraciones
console.log(data) justo antes de enviar la solicitud axios y ese es un objeto para los 4. Luego console.log(response.data) es un objeto para los primeros 3 y una matriz para el último.Su problema es que PHP no distingue matrices y objetos. Al convertir hacia y desde JSON, utiliza una regla para determinar si una matriz asociativa debe convertirse en una matriz JSON o en un objeto JSON. Si las claves son claves numéricas secuenciales que comienzan en 0, las convierte en una matriz JSON. De lo contrario, lo convierte en un objeto. Si las claves son cadenas o números aparentemente es irrelevante.
La solución es no convertir hacia y desde matrices asociativas, sino dejar que json_decode() produzca mezclas de matrices y objetos stdClass . Esto le permite realizar un seguimiento de lo que es o no es un objeto. Para hacer eso, no pase un segundo parámetro al decodificar, o pase un false explícito:
// this variable will probably be of type stdClass $decoded = json_decode($input, false); Al procesar objetos stdClass en PHP, debe ser un poco más detallado. Usará métodos como property_exists() (en lugar de array_key_exists() o isset() ) y para iterar, primero deberá convertir a una array , por ejemplo:
foreach ((array)$decoded as $key => $value) { }Si no tiene control sobre la decodificación JSON en el servidor, puede considerar cambiar su modelo de datos para que no tenga claves numéricas o escribir código en el lado del cliente que pueda manejar matrices que a veces aparecen en el JSON. cuando se esperan objetos. Es molesto, pero esa es una decisión que PHP tomó hace mucho tiempo y solo tenemos que lidiar con eso.