Espacio entre la salida JSON.stringify

3 minutos de lectura

Estoy usando Jquery para obtener el nombre de todos los productos de la página y luego ponerlo en una matriz. estoy usando este codigo

 <script type="text/javascript">
 jQuery(document).ready(function($) {
    var products = $(".product-name").map(function() {
    return { name: $(this).text() }
 }) .get();
 console.log(JSON.stringify(products));
 });
 </script>

Esto me da salida en este formato.

[{“name”:”Sample Product Name”},{“name”:”Sample Product Name 2″}]

Lo que estoy tratando de lograr es tener un espacio entre estos dos objetos después de “,” para que la salida se vea así

[{“name”:”Sample Product Name”}, {“name”:”Sample Product Name 2″}]

¿Algún consejo? Estoy luchando por horas y sin éxito.

Aquí está el jsfiddle
http://jsfiddle.net/2MeMY/1/

  • ¿Por qué quieres la salida como esta? JSON no fue diseñado para que los humanos lean todo el tiempo, por lo que dedicar horas al espacio parece una gran pérdida de tiempo.

    –Erik Phillips

    18 de julio de 2014 a las 22:48

  • @ErikPhilips porque en el sistema donde necesito dar la salida está estructurado de tal manera que necesita una entrada como esta 🙁 [{“name”:”Sample Product Name”}, {“name”:”Sample Product Name 2″}]

    – usuario3550203

    18 de julio de 2014 a las 22:54

  • Así que es un sistema basado en no estándar, lo siento, no puede ser divertido.

    –Erik Phillips

    18/07/2014 a las 22:55


  • @ErikPhilips tuve el mismo problema cuando trabajaba con APIGEE, créanme, ¡no es nada divertido!

    – Ariel

    19 de agosto de 2016 a las 13:32

Puede que esto no sea lo que quieres, pero si solo quieres que se vea mejor, te recomendaría:

console.log(JSON.stringify(products, null, 2));

que te daría

[
  {
    "name": "Sample Product Name"
  },
  {
    "name": "Sample Product Name 2"
  }
]

en la consola Si realmente solo quieres un espacio antes de las comas, podrías hacer:

console.log(JSON.stringify(products).split('},{').join('}, {'));

http://jsfiddle.net/2MeMY/3/

También puedes hacer esto con replace

console.log(JSON.stringify(products).replace(/},{/g,'}, {')); 

// /},{/g means all occurance of },{

  • Si bien este código puede responder la pregunta, proporcionar contexto adicional sobre cómo y/o por qué resuelve el problema mejoraría el valor a largo plazo de la respuesta. Lea esto.

    – Shanteshwar India

    30 de enero de 2019 a las 7:12

Avatar de usuario de Venryx
Venryx

Si quieres una salida json que sea:

  1. Linea sola
  2. Tiene espacios entre nombres y valores de prop (y entre elementos)
  3. Tiene espacios entre cada coma y el siguiente elemento/nombre de utilería

Puedes usar esto:

function Stringify_WithSpaces(obj) {
	let result = JSON.stringify(obj, null, 1); // stringify, with line-breaks and indents
	result = result.replace(/^ +/gm, " "); // remove all but the first space for each line
	result = result.replace(/\n/g, ""); // remove line-breaks
	result = result.replace(/{ /g, "{").replace(/ }/g, "}"); // remove spaces between object-braces and first/last props
	result = result.replace(/\[ /g, "[").replace(/ \]/g, "]"); // remove spaces between array-brackets and first/last items
	return result;
}

let obj = [{name: "Sample Product Name"}, {name: "Sample Product Name 2"}];
console.log("Stringified with spaces: " + Stringify_WithSpaces(obj));

Y aquí está la función como una expresión de una línea:

JSON.stringify(obj, null, 1).replace(/^ +/gm, " ").replace(/\n/g, "").replace(/{ /g, "{").replace(/ }/g, "}").replace(/\[ /g, "[").replace(/ \]/g, "]")

Versión mecanografiada extendida


Aquí hay una versión más detallada (en Typescript) con opciones:

export class ToJSON_WithSpaces_Options {
    insideObjectBraces = false;
    insideArrayBrackets = false;
    betweenPropsOrItems = true;
    betweenPropNameAndValue = true;
}
export function ToJSON_WithSpaces(obj, options?: Partial<ToJSON_WithSpaces_Options>) {
    options = Object.assign({}, new ToJSON_WithSpaces_Options(), options);

    let result = JSON.stringify(obj, null, 1); // stringify, with line-breaks and indents
    result = result.replace(/^ +/gm, " "); // remove all but the first space for each line
    result = result.replace(/\n/g, ""); // remove line-breaks
    if (!options.insideObjectBraces) result = result.replace(/{ /g, "{").replace(/ }/g, "}");
    if (!options.insideArrayBrackets) result = result.replace(/\[ /g, "[").replace(/ \]/g, "]");
    if (!options.betweenPropsOrItems) result = result.replace(/, /g, ",");
    if (!options.betweenPropNameAndValue) result = result.replace(/": /g, `":`);
    return result;
}

Idealmente, este tipo de función aplicará las expresiones regulares previo para eliminar los saltos de línea (para que pueda garantizar que no está modificando el texto dentro de las cadenas proporcionadas por el usuario), pero dejaré que alguien más lo haga, ya que lo anterior es suficiente para mi caso de uso (y creo que la mayoría de los demás ).

¿Ha sido útil esta solución?