如何创建和克隆一个JSON对象?

49
我在想如何创建一个JSON (JS)对象,然后对它进行克隆。

1
为什么“你不能再使用JavaScript数组工作了”?JSON只是JavaScript的数组和对象字面语法。如果您喜欢JSON语法,那么在使用JavaScript中的数组和对象时应该感到非常熟悉。 - Alex Jasmin
请花点时间阅读这篇文章:“JSON对象”不存在 - PetersenDidIt
8个回答

63

这就是我所做的事情,而且它的效果非常好。

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

@Gobliins 是的,它确实可以。 - Matías Cánepa
3
值得一提的是,它将转换对象,比如将日期转换成字符串等。 - A-S
1
很好,除了这种方法,我还没有找到其他的深拷贝方式。 - RobotCharlie

29

只需要去做。

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

2
这种方法似乎会在数据类型转换方面导致一些问题,特别是在嵌套的JSON对象中包括与Array对象相关联的键时。在我的情况下,克隆的对象产生了键:{},而不是原始的键:[]。下面帖子中的方法看起来更可取,即newjsonobj = {...jsonobj}。 - Sandro Rosa
1
值得一提的是,这个答案(而不是Sandro的评论)将对象如日期转换为字符串等。 - A-S

23

从ES6开始,Object.assign是一个很好的方法来做到这一点。

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

第一个参数中的项目会改变现有对象,第三个参数是返回的新对象中的更改。

在ES7中,建议使用展开运算符。

newjsonobj = {...jsonobj}

12
这将创建一个浅克隆:如果第一个 JSON 对象中的值是可变对象或数组等,则对这些值进行修改将影响克隆对象(反之亦然)。例如:var a = {arr:[1,2,3]}; var b = Object.assign({}, a, {}); b.arr[0] = 4; console.log(a.arr); 输出的结果是 [4, 2, 3],而不是预期的 [1, 2, 3] - thenickdude

12

当我解析JSON并在代码中多次重用它时,经常遇到的问题是如何避免每次都从原始JSON字符串重新解析,或者采用serialize/parse方式,这种方式效率较低。

因此,在这些情况下,如果您想要调整已解析的对象但仍保持原始对象不变,请在服务器(NodeJs)或客户端JavaScript代码中使用以下函数。jQuery clone函数效率较低,因为它们处理函数、正则表达式等情况。下面的函数仅处理JSON支持的类型(null、undefined、number、string、array和object):

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;
}

1
最佳答案。所有其他解决方案都有其漏洞。点赞此答案以节省其他人的时间。 - Rafe

7

问题1: 如何在Javascript/jQuery中创建JSON对象?

创建Javascript对象非常简单:

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

创建对象后,您可以向对象添加额外的字段,例如 user.age = 30;
如果您有作为JSON字符串的对象,可以使用内置的 JSON.parse(yourJsonString) 函数或jQuery的 $.parseJSON(yourJsonString) 函数将其转换为JSON对象。 Q2: 如何在javascript/jquery中克隆JSON对象?
我克隆JSON对象的方法是使用jQuery的 extend 函数。例如,您可以生成您的用户对象的克隆,如下所示:
var cloneUser = $.extend(true, {}, {firstName:"John", lastName:"Doe"});

第一个参数确定克隆对象是原始对象的浅拷贝还是深拷贝(参见维基百科上的对象复制)。

要查看其他JSON克隆替代方案,请阅读此文章


JSON.parse 返回一个 Object(参见:MDN),而不是所谓的“JSON对象”,据我所知,这种对象并不存在。(不是挑刺,但这是许多初学者困惑的一个点,因此纠正一下可能会有好处) - StubbornShowaGuy

5
如何在javascript/jquery中创建JSON对象?
没有像JSON“object”这样的东西。JSON代表JavaScript对象表示法,基本上是一个编码信息的字符串,类似于JavaScript的对象文字。
您可以使用JSON.stringify(object)创建这样的编码(将导致一个“string”),请参见{{link1:JavaScript中的JSON}}。您还可以手动创建这样的字符串,但很容易出错,我不建议这样做。
如何在javascript/jquery中克隆JSON对象?
由于它只是一个字符串:
var jsonString2 = jsonString;

我无法再使用JavaScript数组了

JSON是一种用于交换数据的格式,它不是您可以在应用程序中使用的数据结构。


也许您想了解更多关于 JSONJS 中的对象JS 中的数组 的内容。


12
第二个答案是不正确的。"="运算符不会克隆任何对象,而是传递引用。 - Reinhard
5
那么它是对一个无效问题的答案。因此,它不是一个答案。我认为最好删除那一行,以免混淆路过读者并传播错误的智慧。 - Sebastian Mach
@Matthew:我认为你缺少上下文。这是关于JSON(即文本),而不是JavaScript对象/数组的问题。如果您正在使用JavaScript数组,则此答案不适用于您。请注意,该问题在我发布此答案后6年被更改/更新。 - Felix Kling
1
一个JSON对象(我刚才打错了,应该是数组而不是对象)不是键/值对对象吗?我刚在浏览器的控制台中测试了 foo = {"x":"y"}; bar= foo; bar.x = "z"; console.log("Foo: "+foo.x+" | Bar: "+bar.x"),结果两个都变成了 z。我们是在谈论包含JSON格式数据的字符串对象还是JSON对象? - Matthew
1
这似乎是小题大做,非常误导。使用=运算符不会克隆“JavaScript对象”以使用@Reinhard的术语。显然,这就是发帖者所询问的内容。现在...我得去取款机了。 - cl0rkster
显示剩余4条评论

1
我们可以如下克隆JSON对象。
EmployeeDetails = 
{
  Name:"John Deer",
  Age:29,
  Company:"ABC Limited."

}

现在创建一个克隆函数。
function clonning(Employee)
{
  // conversion from Object to String
  var EmployeeString = JSON.stringify(Employee);

  // conversion from String to Object type

  var EmployeeConvertedObject = JSON.parse(EmployeeString);

  // printing before changing prperty value.

  console.log(EmployeeConvertedObject);

  // modifying EmployeeConvertedObject property value 

  EmployeeConvertedObject.Name="Kelvin Bob";

   // printing After changing prperty value.

  console.log(EmployeeConvertedObject);

  // Now printing original json object.

  console.log(Employee);

  // Here original JSON object is not affecting. Only Cloned object affecting.


}

现在调用函数。
clonning(EmployeeDetails);

结果:

clonning(EmployeeDetails)
VM212:22 {Name: "John Deer", Age: 29, Company: "ABC Limited."}
VM212:30 {Name: "Kelvin Bob", Age: 29, Company: "ABC Limited."}
VM212:34 {Name: "John Deer", Age: 29, Company: "ABC Limited."}

0
假设我们有一个名为EmailData的JSONOBJECT,其中包含一些数据。现在,如果您想在另一个对象中获得相同的数据(即克隆数据),则可以执行以下操作:
JSONOBJECT clone_EmailData=new JSONOBJECT(EmailData.toString());

上述语句将为您提供一个具有相同数据的新对象,而这个新对象不是对EmailData对象的引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接