2010-11-08 46 views
18

Me preguntaba cómo puedo crear un objeto JSON (JS) y luego clonarlo.¿Cómo crear y clonar un objeto JSON?

+1

¿Por qué * "can't [you] work longer with javascript array" *? JSON es solo la matriz y la sintaxis literal del objeto de Javascript. Si le gusta la sintaxis de JSON, debería sentirse como en casa cuando utilice arreglos y objetos en Javascipt. –

+0

Tómese su tiempo y lea este artículo: [No existe el "objeto JSON"] (http://benalman.com/news/2010/03/theres-no-such-thing-as-a-json/) – PetersenDidIt

Respuesta

7

Cómo crear un objeto JSON en javascript/jquery?

No hay nada como un objeto JSON . JSON significa JavaScript Object Notation y es básicamente una cadena que codifica información similar a los literales de objetos de JavaScript.

Sin embargo, puede crear una codificación de este tipo (que daría lugar a una cadena ) con JSON.stringify(object), ver JSON in JavaScript. También podría crear una cadena de este tipo manualmente, pero es muy propenso a errores y no lo recomiendo.

¿Cómo puedo clonar un objeto JSON en javascript/jquery?

ya que es sólo una cadena:

var jsonString2 = jsonString; 

¡No puedo trabajar más con matrices de JavaScript

JSON es un formato de intercambio de datos, no es una estructura de datos que puede usar en una aplicación.


Tal vez usted quiere leer más sobre JSON, objects en JS y arrays en JS.

+2

La segunda respuesta NO es verdadera. El operador "=" no clonará ningún objeto sino que pasará la referencia. – Reinhard

+0

@ Reinhard: nunca dije que sí. ** JSON ** en JS solo existe como ** cadena **. Y como las cadenas son inmutables, clonar una cadena es tan simple como asignarla a una variable diferente. Aunque estoy de acuerdo en retrospectiva, el OP puede haber estado hablando de objetos de JavaScript. –

+1

@FelixKling: Entonces es una respuesta a una pregunta inválida. Sigue que no es una respuesta. Creo que sería mejor eliminar esa línea para no confundir drive-by-readers y difundir la mala sabiduría. –

4

Este es un problema que he encontrado a menudo al analizar JSON y reutilizarlo varias veces en el código. Y desea evitar volver a analizar cada vez desde la cadena JSON original, o pasar por el modo serialize/parse que es la manera menos eficiente.

Por lo tanto, en estos casos en los que desee ajustar el objeto analizado sin modificar el original, utilice la siguiente función en el servidor (NodeJs) o en el código javascript del cliente. El clone función jQuery es menos eficiente debido a que tratan los casos para las funciones, expresión regular, etc. La función más adelante, sólo trata los JSON apoyado tipos (null, sin definir, número, cadena, de objeto y matriz):

function cloneJSON(obj) { 
    // basic type deep copy 
    if (obj === null || obj === undefined || typeof obj !== 'object') { 
     return obj 
    } 
    // array deep copy 
    if (obj instanceof Array) { 
     var cloneA = []; 
     for (var i = 0; i < obj.length; ++i) { 
      cloneA[i] = cloneJSON(obj[i]); 
     }    
     return cloneA; 
    }     
    // object deep copy 
    var cloneO = {}; 
    for (var i in obj) { 
     cloneO[i] = cloneJSON(obj[i]); 
    }     
    return cloneO; 
} 
19

esto es lo que hago y funciona como un encanto

if (typeof JSON.clone !== "function") { 
    JSON.clone = function(obj) { 
     return JSON.parse(JSON.stringify(obj)); 
    }; 
} 
+0

¿Esto también funciona para Gobliins

4

Q1: Cómo crear un objeto JSON en JavaScript/jQuery?

Creación de un objeto JavaScript es tan simple:

var user = {}; // creates an empty user object 
var user = {firstName:"John", lastName:"Doe"}; // creates a user by initializing 
// its firstName and lastName properties. 

Después de la creación puede añadir campos adicionales a su objeto como user.age = 30;.

Si tiene el objeto como una cadena JSON, puede convertirlo en un objeto JSON utilizando la función incorporada JSON.parse(yourJsonString) o la función $.parseJSON(yourJsonString) de jQuery.

Q2: ¿Cómo puedo clonar un objeto JSON en javascript/jquery?

Mi forma de clonar objetos JSON es extend función de jQuery. Por ejemplo, se puede generar un clon de su objeto de usuario, como a continuación:

var cloneUser = $.extend(true, {}, {firstName:"John", lastName:"Doe"}); 

El primer parámetro designa si el objeto clon será una copia superficial o profunda del original (ver Object copy en la wiki).

Para ver otras alternativas de clonación JSON, puede leer el artículo this.

+0

'JSON.parse' devuelve un' Objeto' (Ver: [MDN] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#Return_value)), no una "Objeto JSON", que AFAIK no existe. (No es un juego de ingenio, pero este es un punto de confusión para muchos principiantes, así que podría ser bueno corregirlo) – StubbornShowaGuy

12

Eso sí,

var x = {} //some json object here 
var y = JSON.parse(JSON.stringify(x)); //new json object here 
5

A partir de ES6. Object.assign es una buena manera de hacer esto.

newjsonobj = Object.assign({}, jsonobj, {}) 

Los elementos del primer argumento mutan el objeto existente, y el tercer argumento son los cambios en el nuevo objeto devuelto.

En ES7 se propone usar el operador de extensión.

newjsonobj = {...jsonobj} 
+2

Esto crea un clon superficial: Cualquier modificación de los valores en el primer objeto JSON afectará al clon (y viceversa), si esos valores son algo mutable como objetos o matrices. p.ej. 'var a = {arr: [1,2,3]}; var b = Object.assign ({}, a, {}); b.arr [0] = 4; console.log (a.arr); 'imprime' [4, 2, 3] 'en lugar de' [1, 2, 3] 'como se esperaba. – thenickdude