1

Estoy tratando de hacer una petición vía Ajax, pero necesito convertir el objeto de la petición a formato JSON utilizando:

JSON.stringify(obj);

Sin embargo lo que obtengo como resultado es:

{"cSolicitud":[{}]}

Es decir, el objeto dentro del arreglo aparece vacío, pero en realidad tiene varias propiedades con sus respectivos valores. Pienso que la razón por la que JS identifica que es un objeto vacío es por la forma en que construí el objeto, que fue la siguiente:

// declaro la función que agrega dinámicamente las propiedades al objeto
var objectToSend = {
  "cSolicitud": [new Object()]
};
var descriptor = Object.create({});

function addToGeneralO(prop, val, obj) {
if (Object.keys(obj.cSolicitud[0]) == '') {
  console.log('objeto vacío');
    descriptor = {
      value: val,
      configurable: true
     }
    Object.defineProperty(obj.cSolicitud[0], prop, descriptor);
  }
  objectToSend = obj;
};

// acá es una de las funciones en las que llamo la función:
$j(document).ready(function () {
   $j(inputs).each(function (e) {
   if (inputs[e].value != '' && inputs[e].value != '0') {
     if (inputs[e].tagName == 'INPUT') {
        var element = inputs[e];
        var value = inputs[e].value;
        var index = $j(inputs[e]).attr('data_campo');
        usingData(dataFromSS1, element, value, index);
     } else if (inputs[e].tagName == 'SELECT') {
        var element = inputs[e];
        var value = inputs[e].value;
        var index = $j(inputs[e]).attr('data_campo');
        var id = $j(this)[0].id;
        var text;
        if ($j(this)[0].id == 'empleo_colonia') {
            text = $j('select#empleo_colonia option:selected')[0].innerHTML;
            addOtherEls(id, value, objectToSend);
        } else if ($j(this)[0].id == 'empleo_del_mpio') {
           text = $j('select#empleo_del_mpio option:selected')[0].innerHTML;
           addOtherEls(id, value, objectToSend);
        };
        selectFn(element, index, dataFromSS1, value, id, text);
      };
    };
  });
});

No sé exactamente cuál es la razón, pero sospecho que esta forma de construir objetos tiene que ver con el hecho de que identifique al objeto como vacío.

function posting(obj) {
  Object.defineProperty(obj.cSolicitud[0], "emp_palacio", descriptor);
  var size = 0;
  for (key in obj.cSolicitud[0]) {
    if (obj.hasOwnProperty(key)) {
    size++;
    }
  };
  console.log(size); // esto da como resultado 0, lo que indica que el problema no está en el método de stringify, sino en la construcción de objeto
  $j.ajax({
    method: 'POST',
    url: 'http://10.10.213.18:90/rest/SyncSolicitudes',
    data: JSON.stringify(obj),
    crossDomain: true,
  }).done(function (msj) {
    console.log('done');
    console.log(msj);
  }).fail(function (error) {
    console.log(error);
  })
};

Si alguien conoce una manera de solucionar esto u otra forma de construir un objeto agregando propiedades de manera dinámica, se los agradeceré mucho.

PauZA
  • 33
  • 5
  • 5
    ¿Responde esto a tu pregunta? [¿Cómo puedo convertir un string JSON a un objeto en JavaScript?](https://es.stackoverflow.com/questions/1648/c%c3%b3mo-puedo-convertir-un-string-json-a-un-objeto-en-javascript) – JorgeGuz Dec 18 '19 at 16:30

3 Answers3

2

Prueba objectToSend.cSolicitud[0] en vez de obj.cSolicitud[0] sin embargo, aquí te dejo otra alternativa un poco más sencilla, si necesitas agregar más objetos al arreglo cSolicitud solo debes repetir la linea de codigo objectToSend.cSolicitud.push({ prop: descriptor });

var objectToSend = {};
objectToSend.cSolicitud = [];

var descriptor = {
    value: 'valor',
    configurable: true
};

objectToSend.cSolicitud.push({ miPropiedad: descriptor });

console.log(objectToSend.cSolicitud[0]);
CarlosHdz7
  • 94
  • 4
  • La razón por la que está como `obj.cSolicitud[0]` es porque el objeto se pasa como argumento a la función. Y el problema es que dentro del arreglo hay un solo objeto, y las que se van a agregando dinámicamente son las propiedades. ¿Conoces algún **método de objetos** equivalente al **push()** de los arreglos? – PauZA Dec 18 '19 at 13:35
1

Debes utilizar JSON.Parse, te pongo un ejemplo:

var data = '[{"idPermiso":1,"nombre":"Catálogos","idUsuario":11478,"email":"labm"},{"idPermiso":2,"nombre":"Remediación","idUsuario":11478,"email":"labm"},{"idPermiso":1,"nombre":"Catálogos","idUsuario":12338,"email":"BGARCIA"},{"idPermiso":2,"nombre":"Remediación","idUsuario":12338,"email":"BGARCIA"}]';

var obj = JSON.parse(data);
console.log(obj)

El JSON.stringify es para la "inversa", es decir, pasar de JSON a String.

Camilo Bernal
  • 1,377
  • 9
  • 22
  • @PauZA Edita ([edit]) tu pregunta y coloca el código js tal como lo tienes para ver que puede estar pasando. – Camilo Bernal Dec 18 '19 at 13:58
  • Ya lo hice, y ahora el error que tengo es: _Uncaught SyntaxError: Unexpected token o in JSON at position 1 at JSON.parse_ – PauZA Dec 18 '19 at 14:16
  • Este error sale si tienes algún error en el string del json que intentas parsear. – Camilo Bernal Dec 18 '19 at 14:25
  • Sí, porque JSON.parse es para convertir un string a objeto: https://www.w3schools.com/js/js_json_parse.asp "Parse the data with JSON.parse(), and the data becomes a JavaScript object". – PauZA Dec 18 '19 at 15:38
  • Claro, fue lo que comenté en mi respuesta: JSON.parse => de String a Objeto | JSON.stringify => de Objeto a String (En notación Json). Avisame si crees que falta mayor claridad en la respuesta para ajustarla. – Camilo Bernal Dec 18 '19 at 15:41
  • pues justo lo que quiero es convertir un objeto a string, es lo que dice en el primer párrafo de mi pregunta: _Estoy tratando de hacer una petición vía Ajax, pero necesito convertir el objeto de la petición a formato JSON utilizando:_ Si necesitas mayor claridad, me dices. – PauZA Dec 18 '19 at 15:44
  • Si, estaria bien que ampliaras un poco tu pregunta, sobre todo que intentes, en la medida de lo posible, colocar más código para ver el panorama completo. – Camilo Bernal Dec 18 '19 at 15:47
  • Listo, ya está el código más completo. – PauZA Dec 18 '19 at 16:31
1

TestClass = function() {
  this._A = "a";
  this._B = "b";
  Object.defineProperty(this, 'A', {
    get: function() {
      return this._A;
    },
    set: function(value) {
      this._A = value;
    }
  });
  Object.defineProperty(this, 'B', {
    get: function() {
      return this._B;
    },
    set: function(value) {
      this._B = value;
    }
  });
}
const TestLiteral = {
  A: "a",
  B: "b"
}
const objTessClass = new TestClass();
console.info(JSON.stringify(objTessClass))
console.info(JSON.stringify(TestLiteral))

Podrías intentar crear objetos tipo clase y tipo literal

devmiguelopz
  • 493
  • 2
  • 10
  • Pero esto no permite que las propiedades que puedan agregar de manera dinámica, cierto? – PauZA Dec 18 '19 at 16:03
  • Si, con `const objTessClass = new TestClass();` puedes agregar propiedades dinamicas `objTessClass.NuevaPropiedad = "test"` de igual manera para los objetos literales. – devmiguelopz Dec 18 '19 at 16:46
  • ¡Muchas gracias! Me funcionó perfecto. – PauZA Dec 18 '19 at 17:59
  • Espera, solo que no está agregando dinámicamente las propiedades...necesito que se puedan agregar a partir de una variable pasada como argumento dentro de una función, cómo podría hacerlo? – PauZA Dec 18 '19 at 18:07
  • Tengo lo siguiente: `var nuevaPropiedad = "nombre_usuario"; objTessClass.nuevaPropiedad = "Cosme Fulanito";` Y lo que sale es: `{"id_solicitud":"90013123_15999_20190927165702","emp_palacio":"90013123","nuevaPropiedad":"Cosme Fulanito"}` – PauZA Dec 18 '19 at 18:09
  • 1
    Ya lo solucioné: ` objTessClass[nuevaPropiedad] = "Cosme Fulanito";` – PauZA Dec 18 '19 at 18:14