本文将介绍排序对象属性和JSON.stringify的详细情况,特别是关于对象的排序的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于JSON字符串转
本文将介绍排序对象属性和JSON.stringify的详细情况,特别是关于对象的排序的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于JSON 字符串转换为JavaScript 对象.JSON.parse()和JSON.stringify()、JSON.parse()和JSON.stringify()、JSON.parse()和JSON.stringify()--json对象<=>字符串、JSON.stringify()和JSON.parse()的知识。
本文目录一览:- 排序对象属性和JSON.stringify(对象的排序)
- JSON 字符串转换为JavaScript 对象.JSON.parse()和JSON.stringify()
- JSON.parse()和JSON.stringify()
- JSON.parse()和JSON.stringify()--json对象<=>字符串
- JSON.stringify()和JSON.parse()
排序对象属性和JSON.stringify(对象的排序)
我的应用程序包含大量对象,我将它们进行字符串化并将其保存到磁盘。不幸的是,当数组中的对象被操纵并且有时被替换时,对象上的属性以不同的顺序列出(它们的创建顺序?)。当我在数组上执行JSON.stringify()并将其保存时,一个diff显示以不同顺序列出的属性,当尝试使用diff和合并工具进一步合并数据时,这很烦人。
理想情况下,我想在执行字符串化之前或作为字符串化操作的一部分,按字母顺序对对象的属性进行排序。有代码可以在许多地方操作数组对象,而更改它们以始终以显式顺序创建属性将很困难。
建议将是最欢迎的!
一个简洁的例子:
obj = {}; obj.name="X"; obj.os="linux";JSON.stringify(obj);obj = {}; obj.os="linux"; obj.name="X";JSON.stringify(obj);
这两个string化调用的输出是不同的,并且显示在我的数据的差异中,但是我的应用程序并不关心属性的顺序。这些对象以多种方式和位置构造。
答案1
小编典典更简单,现代且当前受浏览器支持的方法如下:
JSON.stringify(sortMyObj, Object.keys(sortMyObj).sort());
但是,此方法会删除所有未引用的嵌套对象,并且不适用于数组内的对象。如果您想要类似以下输出的内容,则也将希望使排序对象变平:
{"a":{"h":4,"z":3},"b":2,"c":1}
您可以这样做:
var flattenObject = function(ob) { var toReturn = {}; for (var i in ob) { if (!ob.hasOwnProperty(i)) continue; if ((typeof ob[i]) == ''object'') { var flatObject = flattenObject(ob[i]); for (var x in flatObject) { if (!flatObject.hasOwnProperty(x)) continue; toReturn[i + ''.'' + x] = flatObject[x]; } } else { toReturn[i] = ob[i]; } } return toReturn;};JSON.stringify(sortMyObj, Object.keys(flattenObject(sortMyObj)).sort());
要通过编程进行一些调整,您需要将对象的属性名称放入一个数组中,然后按字母顺序对数组进行排序,然后依次遍历该数组(顺序正确),然后从对象中选择每个值那个命令。同时也检查“
hasOwnProperty”,因此您绝对只有对象自己的属性。这是一个例子:
var obj = {"a":1,"b":2,"c":3};function iterateObjectAlphabetically(obj, callback) { var arr = [], i; for (i in obj) { if (obj.hasOwnProperty(i)) { arr.push(i); } } arr.sort(); for (i = 0; i < arr.length; i++) { var key = obj[arr[i]]; //console.log( obj[arr[i]] ); //here is the sorted value //do what you want with the object property if (callback) { // callback returns arguments for value, key and original object callback(obj[arr[i]], arr[i], obj); } }}iterateObjectAlphabetically(obj, function(val, key, obj) { //do something here});
同样,这应确保您按字母顺序进行遍历。
最后,以最简单的方式进行扩展,该库将递归地允许您对传递给它的任何JSON进行排序:https : //www.npmjs.com/package/json-stable-
stringify
var stringify = require(''json-stable-stringify'');var obj = { c: 8, b: [{z:6,y:5,x:4},7], a: 3 };console.log(stringify(obj));
输出量
{"a":3,"b":[{"x":4,"y":5,"z":6},7],"c":8}
JSON 字符串转换为JavaScript 对象.JSON.parse()和JSON.stringify()
使用 JavaScript 内置函数 JSON.parse() 将字符串转换为 JavaScript 对象:
console.log(obj.sites[1].name);<span>//<span>Google
console.log(obj.sites[1].url);<span>//<span>www.google.com
用于将 JavaScript 值转换为 JSON 字符串。
语法
value:
必需, 一个有效的 JSON 字符串。
replacer:
可选。用于转换结果的函数或数组。
如果 replacer 为函数,则 JSON.stringify 将调用该函数,并传入每个成员的键和值。使用返回值而不是原始值。如果此函数返回 undefined,则排除成员。根对象的键是一个空字符串:""。
如果 replacer 是一个数组,则仅转换该数组中具有键值的成员。成员的转换顺序与键在数组中的顺序一样。当 value 参数也为数组时,将忽略 replacer 数组。
space:
可选,文本添加缩进、空格和换行符,如果 space 是一个数字,则返回值文本在每个级别缩进指定数目的空格,如果 space 大于 10,则文本缩进 10 个空格。space 有可以使用非数字,如:\t。
实例
""
" + str_pretty1 + """
" document.write( "使用参数情况:""
""
" + str_pretty2 + "" ); 输出
测试结果
<span>{
"name": "菜鸟教程"<span>,"site": "http://www.runoob.com"<span>
}
JSON.parse()和JSON.stringify(),这两个JavaScript内置的方法,对低版本浏览器不兼容,。
需要引入JSON2.js插件
JSON.parse()和JSON.stringify()
wangxiaohu__的专栏http://blog.csdn.net/wangxiaohu__/article/details/7254598
parse用于从一个字符串中解析出json对象,如
var str = '{"name":"huangxiaojian","age":"23"}'
结果:
JSON.parse(str)
stringify()用于从一个对象解析出字符串,如
var a = {a:1,b:2}
JSON.stringify(a)
SON.stringify 函数
将 JavaScript 值转换为 JavaScript 对象表示法 (Json) 字符串。
JSON.stringify(value [,replacer] [,space])
- value
-
必需。 要转换的 JavaScript 值(通常为对象或数组)。
- replacer
-
可选。 转换结果的函数或数组。
如果 replacer 为一个函数,则 JSON.stringify 会调用该函数,并传入每个成员的键和值。 使用返回值而不是原始值。 如果此函数返回 undefined,则排除成员。 根对象的键是一个空字符串:""。
如果 replacer 为一个数组,则仅转换该数组中具有键值的成员。 成员的转换顺序与键在数组中的顺序一样。 当 value 参数也为数组时,将忽略 replacer 数组。
- space
-
可选。 向返回值 JSON 文本添加缩进、空白和换行符以使其更易于读取。
如果省略 space,则将生成返回值文本,而没有任何额外空白。
如果 space 为一个数字,则返回值文本在每个级别缩进指定数目的空格。 如果 space 大于 10,则文本缩进 10 个空格。
如果 space 是非空字符串(例如“\t”),则返回值文本在每个级别中缩进字符串中的字符数。
如果 space 是长度大于 10 个字符的字符串,则使用前 10 个字符。
一个包含 JSON 文本的字符串。
异常 |
条件 |
---|---|
替换器参数无效 |
replacer 参数不是函数或数组。 |
值参数中不支持循环引用 |
value 参数包含循环引用。 |
如果 value 具有 toJSON 方法,则 JSON.stringify 函数使用该方法的返回值。 如果 toJSON 方法的返回值为 undefined,则不转换成员。 这使对象能够确定其自己的 JSON 表示形式。
将不会转换不具有 JSON 表示形式的值,例如 undefined。 在对象中,将丢弃这些值。 在数组中,会将这些值替换为 null。
字符串值以引号开始和结束。 所有 Unicode 字符可括在引号中,除了必须使用反斜杠进行转义的字符。 以下字符的前面必须是反斜杠:
-
引号 (")
-
反斜杠 (\)
-
Backspace (b)
-
换页 (f)
-
换行符 (n)
-
回车 (r)
-
水平制表符 (t)
-
四个十六进制数字 (uhhhh)
执行顺序
在序列化过程中,如果 value 参数具有 toJSON 方法,则 JSON.stringify 会首先调用 toJSON 方法。 如果该方法不存在,则使用原始值。 紧接着,如果提供 replacer 参数,则该值(原始值或 toJSON 返回值)将替换为 replacer 参数的返回值。 最后,根据可选的 space 参数向该值添加空白以生成最终的 JSON 文本。
此示例使用 JSON.stringify 将 contact 对象转换为 JSON 文本。 定义 memberfilter 数组以便只转换 surname 和 phone 成员。 省略 firstname 成员。
- varcontact=newObject();
- contact.firstname="Jesper";
- contact.surname="Aaberg";
- contact.phone=["555-0100","555-0120"];
- varmemberfilter=newArray();
- memberfilter[0]="surname";
- memberfilter[1]="phone";
- varjsonText=JSON.stringify(contact,memberfilter,"\t");
- document.write(jsonText);
- //Output:
- //{"surname":"Aaberg","phone":["555-0100","555-0120"]}
此示例使用带数组的 JSON.stringify。 replacetoupper 函数将数组中的每个字符串转换为大写形式。
- varcontinents=newArray();
- continents[0]="Europe";
- continents[1]="Asia";
- continents[2]="Australia";
- continents[3]="Antarctica";
- continents[4]="northAmerica";
- continents[5]="SouthAmerica";
- continents[6]="Africa";
- varjsonText=JSON.stringify(continents,replacetoupper);
- functionreplacetoupper(key,value){
- returnvalue.toString().toupperCase();
- }
- //Output:
- //"EUROPE,ASIA,AUSTRALIA,ANTARCTICA,norTHAMERICA,SOUTHAMERICA,AFRICA"
此示例使用 toJSON 方法将字符串值转换为大写形式。
- varcontact=newObject();
- contact.firstname="Jesper";
- contact.surname="Aaberg";
- contact.phone=["555-0100","555-0120"];
- contact.toJSON=function(key)
- {
- varreplacement=newObject();
- for(varvalinthis)
- {
- if(typeof(this[val])==='string')
- replacement[val]=this[val].toupperCase();
- else
- replacement[val]=this[val]
- }
- returnreplacement;
- };
- varjsonText=JSON.stringify(contact);
- document.write(jsonText);
- //Output:
- {"firstname":"JESPER","surname":"AABERG","phone":["555-0100","555-0120"]}
- '{"firstname":"JESPER","surname":"AABERG","555-0120"]}'
- */
在以下文档模式中受到支持:Internet Explorer 8 标准、Internet Explorer 9 标准、Internet Explorer 10 标准、Internet Explorer 11 标准。Windows 应用商店 应用程序中也支持此项。请参阅版本信息。
在以下文档模式中不受支持:Quirks、Internet Explorer 6 标准模式、Internet Explorer 7 标准模式。
参考
JSON.parse()和JSON.stringify()--json对象<=>字符串
1.parse 用于从一个字符串中解析出json 对象。例如
var str='{"name":"cpf","age":"23"}'
经 JSON.parse(str) 得到:
Object: age:"23"
name:"cpf"
_proto_:Object
ps:单引号写在{}外,每个属性都必须双引号,否则会抛出异常
2.stringify用于从一个对象解析出字符串,例如
var a={a:1,b:2}
经 JSON.stringify(a)得到:
“{“a”:1,"b":2}”
JSON.stringify()和JSON.parse()
我们知道,JSON.stringify() 和 JSON.parse() 是一对处理JSON数据的方法,前者是将JSON对象序列化为字符串,而后者是将JSON字符串解析为JSON对象。
但是你有较为深入地去了解过它们吗?它们分别可以传入几个参数以及每个参数对应的作用是什么呢?
一、JSON.stringify()
JSON.stringify() 方法能将一个 JavaScript 对象或值转换成一个 JSON 字符串,是用于调试的最常见函数。
//初始化一个 user 对象
const user = {
"name": "Mark Lee",
"age":26
}
console.log(JSON.stringify(user));
// 结果
// "{"name":"Prateek Singh","age":26}"
一般来说,开发人员使用 stringify 函数的场景较为普遍,就像上面做的那样。但我要告诉你一些隐藏的秘密,这些小秘密会让你开发起来更加轻松。
JSON.stringify 基础语法
JSON.stringify(value[, replacer [, space]])
它可以传入三个参数,参数1 是需要字符串化的对象,参数2 是用于指定对象序列化过程中需要被处理的属性,参数3 是用于指定输出字符串的缩进格式。后两个参数是可选的,而我们最常用的就是只传一个参数。
第一个参数
需要字符串化的对象,且该对象须是安全的JSON对象,而对于不安全的JSON对象都不能被正常序列化。
1、不安全的JSON对象
何为不安全的JSON对象?
undefined、function、symbol和包含循环的引用的对象都不符合JSON结构标准,所以它们本身以及包含它们的对象都是不安全的JSON对象。
那么对于不安全的JSON对象,JSON.stringify()会如何处理它们呢?
1) undefined、function、symbol
单独处理它们,直接返回undefined。
JSON.stringify(undefined); // undefined
JSON.stringify(function(){}); // undefined
JSON.stringify(Symbol()); // undefined
包含它们的对象,自动将其忽略。
JSON.stringify({a:1, b:undefined, c:function(){}, [Symbol()]:1}); // "{"a":1}"
包含它们的数组,自动将其转成null
JSON.stringify([1,undefined,function(){},Symbol()]); // "[1,null,null,null]"
2) 包含循环引用的对象
如果两个对象之间互相引用,形成一个无限循环,那么无论对其中的哪个对象进行JSON字符串化都会直接报错
var obj1 = {};
var obj2 = {
a: obj1
};
obj1.a = obj2;
JSON.stringify(obj1); // Uncaught TypeError
JSON.stringify(obj2); // Uncaught TypeError
2、含有toJSON()方法的对象
对该类对象进行JSON字符串化,会先调用toJSON()方法,然后用它的返回值来进行序列化,而不是将整个对象转换为字符串。
const user = {
firstName:"Mark",
lastName:"Lee",
age:26,
toJSON(){
return{
fullName:`${this.firstName} + ${this.lastName}`
};
}
}
JSON.stringify(user);
//"{"fullName":"Mark + Lee"}"
这里我们可以看到,它只打印 toJSON 函数的结果,而不是打印整个对象。
再举个栗子:
var obj = {
a: 1,
toJSON(){
return function(){}
}
};
JSON.stringify(obj); // undefined
正常按照前面讲的忽略function来说应该要返回"{"a":1}"才对嘛,为啥是undefined呢? 这就是因为包含toJSON()方法的缘故,只要有它,直接就处理它的返回值。上例中因为toJSON()方法返回值是个不安全的JSON对象,所以就按照前面 1 中讲的方式来处理了。
下面的栗子看的更清楚一些:
var obj = {
a: 1,
toJSON(){
return [1,undefined,function(){},Symbol()]
}
};
JSON.stringify(obj); // "[1,null,null,null]"
第二个参数(数组)
是的,stringify 函数也可以有第二个参数。它是要在控制台中打印的对象的键数组。看起来很简单?让我们更深入一点。我们有一个对象 product 并且我们想知道 product 的 name 属性值。当我们将其打印出来:它会输出下面的结果。
{"id":"0001","type":"donut","name":"Cake","ppu":0.55,"batters":{"batter":[{"id":"1001","type":"Regular"},{"id":"1002","type":"Chocolate"},{"id":"1003","type":"Blueberry"},{"id":"1004","type":"Devil’s Food"}]},"topping":[{"id":"5001","type":"None"},{"id":"5002","type":"Glazed"},{"id":"5005","type":"Sugar"},{"id":"5007","type":"Powdered Sugar"},{"id":"5006","type":"Chocolate with Sprinkles"},{"id":"5003","type":"Chocolate"},{"id":"5004","type":"Maple"}]}
在日志中很难找到 name 键,因为控制台上显示了很多没用的信息。当对象变大时,查找属性的难度增加。stringify 函数的第二个参数这时就有用了。让我们重写代码并查看结果
JSON.stringify(product,[''name''])
// "{"name":"Cake"}"
第二个参数(函数)
我们还可以传入函数作为第二个参数。它根据函数中写入的逻辑来计算每个键值对。如果返回 undefined,则不会打印键值对。
const user = {
"name": "Mark Lee",
"age":26
}
JSON.stringify(user,(key,value)=>{
if(typeof value === ''string''){
return undefined;
}
return value;
})
// 结果
// "{"age":26}"
只有 age 被打印出来,因为函数判断 typeOf 为 String 的值返回 undefined。
第三个参数为数字
第三个参数控制最后一个字符串的间距。如果参数是一个数字,则字符串化中的每个级别都将缩进这个数量的空格字符。
const user = {
"name": "Mark Lee",
"age":26
}
JSON.stringify(user,null,2);
//"{
// "name": "Mark Lee",
// "age": 26
//}"
第三个参数为字符串
如果第三个参数是 string,那么将使用它来代替上面显示的空格字符。
JSON.stringify(user,null,''**'')
//"{
//**"name": "Mark Lee",
//**"age": 26
//}"
二、JSON.parse()
了解完了JSON.stringify(),我们再来看看它的逆操作函数JSON.parse()。
JSON.parse(text[, reviver])
它可以传入两个参数,参数1 是需要被解析的字符串,参数2 是用于修改解析生成的原始值。后一个参数是可选的,而我们最常用的就是只传一个参数。
1. 参数一(text)
该参数必须是符合JSON规范的字符串,如果是其他类型,则会被强制类型转换成字符串格式,如果不符合JSON规范,则会报错。
JSON.parse(''[1,2]''); // [1,2]
JSON.parse(''null''); // null
JSON.parse(''false''); // false
JSON.parse(''{"a":1}''); // {a: 1}
JSON.parse(''{a:1}''); // Uncaught SyntaxError
JSON.parse("{''a'':1}"); // Uncaught SyntaxError
JSON.parse(''undefined''); // Uncaught SyntaxError
注意JSON字符串中的key必须有双引号(单引号也不行),不然是不符合JSON规范的。
2. 参数二(reviver)
该参数是个函数,作用类似于前面JSON.stringify()的第二个参数replacer,同样是对属性进行遍历,同样有key和value两个参数。
var str = ''{"a": 1, "b":2}'';
JSON.parse(str, function(key,value){
if(key === ''a'') {
console.log(value); // 1
return function(){}
}
if(key === ''b'') {
console.log(value); // 2
return ''bbb''
}
if(key === '''') {
console.log(value); // {a: function(){}, b: "bbb"}
return {a:1,c:2}
}
}); // {a: 1, c: 2}
前面属性的遍历可以修改输出对象的属性值,但最终输出的值关键还是取决于key为空字符串时的返回值,它可以将之前所有的努力都变为徒劳。
总结
- 单独字符串化undefined、function和symbol结果都为undefined;
- 字符串化含有undefined、function和symbol的对象,这些值所在的属性都会被忽略;
- 字符串化含有undefined、function和symbol的数组,这些值都会被转化为null;
- 字符串化含有循环引用的对象会报错;
- 字符串化含有toJSON()方法的对象,会直接字符串化该方法执行的返回值;
- JSON.stringify()的三个参数作用依次为 指定需要字符串化的对象、指定对象序列化过程中需要被处理的属性 和 指定输出字符串的缩进格式;
JSON.parse()的两个参数作用依次为 指定需要被解析的字符串 和 修改解析生成的原始值。
两者结合使用场景
1、localStorage/sessionStorage 存储对象
我们知道 localStorage/sessionStorage 只可以存储字符串,当我们想存储对象的时候,需要使用 JSON.stringify 转换成字符串,获取的时候再 JSON.parse
// 存 function setLocalStorage(key,val) { window.localStorage.setItem(key, JSON.stringify(val)); }; // 取 function getLocalStorage(key) { let val = JSON.parse(window.localStorage.getItem(key)); return val; };
2、实现对象深拷贝
let myIntro = { name: ''Gopal'', age: 25, like: ''FE'' } function deepClone() { return JSON.parse(JSON.stringify(myIntro)) } let copyMe = deepClone(myIntro) copyMe.like = ''Fitness'' console.log(myIntro, copyMe) // { name: ''Gopal'', age: 25, like: ''FE'' } { name: ''Gopal'', age: 25, like: ''Fitness'' }
今天关于排序对象属性和JSON.stringify和对象的排序的讲解已经结束,谢谢您的阅读,如果想了解更多关于JSON 字符串转换为JavaScript 对象.JSON.parse()和JSON.stringify()、JSON.parse()和JSON.stringify()、JSON.parse()和JSON.stringify()--json对象<=>字符串、JSON.stringify()和JSON.parse()的相关知识,请在本站搜索。
本文标签: