50

A menudo se utilizan indistintamente los términos JSON y objeto (e incluso objeto JSON cuando hablamos de una estructura de datos, sobre todo en contextos relacionados con AJAX.

  • ¿Cuál es la direfencia entre ambos?
  • ¿Es un JSON un objeto Javascript o es otra cosa?
Pablo Lozano
  • 45,934
  • 7
  • 48
  • 87
  • pregunta relacionada [¿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) – JackNavaRow Nov 09 '18 at 19:40

2 Answers2

81

Asumo que el lector tiene unos conocimientos básicos de Javascript:

//así declaramos un objeto básico en Javascript
let objeto={ atributo: 'valor'}

No son lo mismo

JSON es el acrónimo de JavaScript Object Notation, es un formato de texto ligero para el intercambio de datos. ¿Qué quiere decir esto? Bueno, si vemos el siguiente texto

<lista-nodos>
  <nodo id="1">texto1</nodo>
  <nodo id="3">texto2</nodo>
  <nodo id="5">texto1</nodo>
</lista-nodos>

Todo programador tiene claro que eso es un texto en formato XML. Pues bien, JSON no es más que un formato distinto pero con la misma función. El equivalente a ese XML podría ser algo como:

[
  { "id": "1", "valor": "texto1"},
  { "id": "3", "valor": "texto2"},
  { "id": "5", "valor": "texto1"}
]

Como su propio nombre indica, esta notación es similar a la que usaríamos en Javascript para crear un objeto:

const datos=[
  { id: "1", valor: "texto1"},
  { id: "3", valor: "texto2"},
  { id: "5", valor: "texto1"}
];

datos.forEach(dato=> console.log('elemento:',dato.id,dato.valor))
console.info("tipo de dato=", typeof(datos))

Pero un JSON es, y aquí me estoy repitiendo, texto:

//esto es un texto en formato JSON
const datosJson=`[
  { "id": "1", "valor": "texto1"},
  { "id": "3", "valor": "texto2"},
  { "id": "5", "valor": "texto1"}
]`;

console.log(datosJson);
console.info("tipo de dato=", typeof(datosJson))

El formato JSON es algo más restrictivo de lo que sería el código Javascript:

  • Todos los valores de tipo string deben ir entre comillas dobles, las comillas simples no están permitidas.
  • Del mismo modo, todas las claves (los nombres de los atributos) deben ir entre comillas dobles.
  • No admite ningún tipo de comentarios (a diferencia de XML, donde podemos usar <!-- Comentarios-->)
  • Los valores numéricos han de estar en base decimal, no admite ceros a la izquierda (que pudieran pensar que el número está en base octal).
  • No se admiten valores undefined.

Y, ¿cómo transformamos el texto en un objeto manipulable? ¿Y cómo hacemos la operación inversa?

Usando las siguientes funciones:

  • JSON.parse(<texto>) nos devuelve un objeto creado a partir de un string que esté en formato JSON.
  • JSON.stringify(obj) nos devuelve un string en formato JSON con los atributos del objeto obj. Si obj tiene atributos que sean funciones, serán ignorados.

//texto con formato inválido
const datosJson=`[
  { "id": "1", valor: "texto1"},
  { "id": "3", valor: "texto2"},
]`;
try {
  const datos=JSON.parse(datosJson);
} catch(error) {
  console.log('Falla porque las claves valor no está entre comillas')
}
const datosJson2=`[
  { "id": 1, "valor": "texto1"},
  { "id": 3, "valor": "texto2"},
  { "id": 5, "valor": "texto1"}
]`;
//transformamos a objeto
const d=JSON.parse(datosJson2);
console.log(d[0].id);

//añadimos un elemento
d.push({id:4,valor:'otro texto'});

//transformamos el objeto de nuevo a JSON
console.log(JSON.stringify(d));

Por tanto, aunque JSON tenga como origen el lenguaje Javascript, no es más que una forma de enviar datos entre aplicaciones, que no necesariamente estarán implementadas con Javascript: cualquier lenguaje de programación puede procesar un JSON (al igual que un XML) para obtener la información necesaria.

Dos ejemplos cotidianos del uso de JSON son:

  • AJAX: Cuando mandamos o recibimos datos desde un servidor, la información se suele mandar como texto plano, no podemos mandar un objeto como datos binarios si el lenguaje que los recibe no va a saber interpretarlos (muchas veces, al pedir recursos a un API de terceros, no sabemos siquiera qué lenguaje de programación se usó).
  • Web Storage: Cuando queremos guardar datos en el navegador del usuario, usando el localStorage o el sessionStorage, los métodos setItem y getItem sólo trabajan con el tipo string, con lo que es necesario transformar los objetos que queremos guardar a texto.
Pablo Lozano
  • 45,934
  • 7
  • 48
  • 87
  • 5
    Pablo, interesante pregunta/respuesta. JSON tiene más limitaciones en casos particulares. En el pasado [tuve problemas con enteros que necesitaba con ceros a la izquierda](https://es.stackoverflow.com/q/139850/29967) y también [con los valores nulos](https://es.stackoverflow.com/q/140684/29967). No quita que JSON sea hoy día uno de los inventos más útiles, algo sencillo pero que es parte de la revolución de la informática, según mi humilde opinión. – A. Cedano May 16 '18 at 16:48
  • 2
    Iré actualizando la respuesta, aún es un *work in progress*, gracias por esos detalles – Pablo Lozano May 16 '18 at 16:50
  • 5
    Agregando un poco a tu respuesta el como saber cual es el [standard de un JSON](https://www.json.org/json-es.html), y segun ecmaScript la [construccion de un objeto](http://ecma-international.org/ecma-262/#sec-ecmascript-standard-built-in-objects) – JackNavaRow May 16 '18 at 17:06
3

Yo quisiera dar una respuesta más coloquial, algo que podrías dar como ejemplo a un no programador o principiante.

- Objeto: se circunscribe al código, se inicializa y se trabaja con el objeto durante la ejecución de un programa. El objeto estará formateado según las reglas semánticas del correspondiente lenguaje (orientado a objetos) en el que está escrito el código en el que se definen los objetos.

- JSON: es el 'archivo' que se usa como input-output, para inicializar o guardar estados o valores de un objeto y como es un 'estándar', tiene sus propias reglas semánticas definidas. Esta estandarización del formato hace que JSON tenga compatibilidad entre diferentes lenguajes de programación.

P. C.
  • 86
  • 7
  • 2
    *algo que podrías dar como ejemplo a un no programador* -> Si está en SO se asume que es para programadores. Además, en la pregunta se especificó claramente `objeto Javascript` con lo cual *El objeto estará formateado según las reglas semánticas del correspondiente lenguaje (orientado a objetos) en el que esta escrito el código en el que se definen los objetos* no hace referencia a lo preguntado. – Benito-B Mar 25 '21 at 14:49
  • Entiendo tu comentario pero por como se formula la pregunta en el título me hace pensar que aquí podrían llegar personas principiantes o simplemente ante la duda, solo todo objeto es JSON. – P. C. Mar 25 '21 at 16:23