如何创建和克隆 JSON 对象?

Posted

技术标签:

【中文标题】如何创建和克隆 JSON 对象?【英文标题】:How to create and clone a JSON object? 【发布时间】:2011-05-06 10:47:10 【问题描述】:

我想知道如何创建 JSON (JS) 对象然后克隆它。

【问题讨论】:

为什么“[你]不能再使用javascript数组了”? JSON 只是 Javascript 的数组和对象字面量语法。如果您喜欢 JSON 语法,那么在 Javascipt 中使用数组和对象时应该会感到宾至如归。 花点时间阅读这篇文章:There's no such thing as a "JSON Object" 【参考方案1】:

这就是我所做的,它就像一个魅力

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

【讨论】:

@Gobliins 是的 但值得一提的是,它是将日期等对象转换为字符串等。【参考方案2】:

做吧

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

【讨论】:

这种方法似乎会引起数据类型之间的一些转换问题,在嵌套 JSON 对象的情况下,还包括与 Array 对象关联的键。在我的例子中,克隆的对象产生了密钥:,而不是原始密钥:[] 下面帖子中的方法看起来,newjsonobj = ...jsonobj,看起来更可取 值得一提的是,这个答案(不是 Sandro 的评论)是将日期等对象转换为字符串等【参考方案3】:

从 ES6 开始。 Object.assign 是一个很好的方法。

newjsonobj = Object.assign(, jsonobj, )

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

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

newjsonobj = ...jsonobj

【讨论】:

这会创建一个浅层克隆:如果这些值是可变的对象或数组,那么对第一个 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]【参考方案4】:

这是我在解析 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;

【讨论】:

最佳答案。所有其他解决方案都有其漏洞。点赞这个以节省其他人的时间【参考方案5】:

Q1如何在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");

第一个参数指定克隆对象是原始对象的浅拷贝还是深层拷贝(参见 wiki 上的Object copy)。

要查看其他 JSON 克隆替代方案,您可以阅读 this 文章。

【讨论】:

JSON.parse 返回Object(参见:MDN),而不是“JSON 对象”,AFAIK 不存在该对象。 (不要吹毛求疵,但这对许多初学者来说是一个困惑点,因此纠正它可能会很好)【参考方案6】:

如何在 javascript/jquery 中创建 JSON 对象?

没有什么比得上 JSON object。 JSON 代表 JavaScript Object Notation,它基本上是一个字符串,它对类似于 JavaScript 的对象字面量的信息进行编码。

但是,您可以使用JSON.stringify(object) 创建这样的编码(这将产生一个字符串),请参阅JSON in JavaScript。也可以手动创建这样的字符串,但是很容易出错,不推荐。

如何在 javascript/jquery 中克隆 JSON 对象?

因为它只是一个字符串:

var jsonString2 = jsonString;

我不能再使用 javascript 数组了

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


也许您想了解更多关于 JS 中的 JSON、objects 和 JS 中的 arrays 的信息。

【讨论】:

第二个答案不正确。 “=”运算符不会克隆任何对象,但会传递引用。 @Reinhard:我从未声称它确实如此。 JS 中的 JSON 仅作为 string 存在。由于字符串是不可变的,因此克隆字符串就像将其分配给不同的变量一样简单。虽然我同意事后看来,OP 可能一直在谈论 JavaScript 对象。 @FelixKling:那么这是对无效问题的回答。它遵循它不是一个答案。我认为最好删除这条线,以免迷惑路过的读者并传播错误的智慧。 JSON 对象(我刚刚意识到我输入了数组)不是键/对对象吗?我刚刚在浏览器的控制台foo = "x":"y"; bar= foo; bar.x = "z"; console.log("Foo: "+foo.x+" | Bar: "+bar.x") 中进行了测试,并将它们都更改为z。我们说的是包含 JSON 格式数据的 String 对象还是 JSON 对象? 这看起来很迂腐,很容易误导人。 = 运算符不会克隆“JavaScript 对象”以使用@Reinhard 术语。显然,这就是海报所要问的。现在......我必须去自动取款机。【参考方案7】:

我们可以如下克隆 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."

【讨论】:

【参考方案8】:

假设, 我们有一个 JSONOBJECT EmailData,其中有一些数据。现在,如果您想在另一个对象中使用相同的数据(即克隆数据),那么您可以执行以下操作:

JSONOBJECT clone_EmailData=new JSONOBJECT(EmailData.toString());

上面的语句会给你一个具有相同数据的新对象,并且这个新对象不是对 EmailData 对象的引用。

【讨论】:

【参考方案9】:

您可以使用扩展运算符来制作对象的副本。对于对象,您使用语法…objectToCopy,对于数组,语法是[…arrayToCopy]。注意:您不能对原语使用扩展运算符,这也是 ES6 的特性。

var aa =  n : 1 
var bb =  ...aa  // bb is a copy of aa by val not by ref, changing bb will not affect aa, and changing aa will not affect bb

【讨论】:

请解释您的代码在做什么。不是每个人都知道传播运算符 及其在做什么。

以上是关于如何创建和克隆 JSON 对象?的主要内容,如果未能解决你的问题,请参考以下文章

克隆解析服务器对象

如何正确克隆 JavaScript 对象?

如何正确克隆 JavaScript 对象?

如何正确克隆 JavaScript 对象?

如何正确克隆 JavaScript 对象?

如何正确克隆 JavaScript 对象?