我正在使用使用不正确的JSON格式的服务(属性周围没有双引号)。所以我需要发送
{ name: "John Smith" }
代替 { "name": "John Smith" }
无法更改此格式,因为这不是我的服务。
有谁知道像上面这样格式化JavaScript对象的字符串化路由?
Answers:
在大多数情况下,此简单的正则表达式解决方案可取消对JSON属性名称的引用:
const object = { name: 'John Smith' };
const json = JSON.stringify(object); // {"name":"John Smith"}
console.log(json);
const unquoted = json.replace(/"([^"]+)":/g, '$1:');
console.log(unquoted); // {name:"John Smith"}
极端情况:
var json = '{ "name": "J\\":ohn Smith" }'
json.replace(/\\"/g,"\uFFFF"); // U+ FFFF
json = json.replace(/"([^"]+)":/g, '$1:').replace(/\uFFFF/g, '\\\"');
// '{ name: "J\":ohn Smith" }'
特别感谢Rob W修复了它。
在正常情况下,上述正则表达式可以正常工作,但是从数学上讲,不可能用正则表达式来描述JSON格式,以使其在每种情况下都可以工作(对于正则表达式,计数相同数量的花括号是不可能的。)通过本地函数正式解析JSON字符串并重新序列化,创建一个新的函数以删除引号:
function stringify(obj_from_json) {
if (typeof obj_from_json !== "object" || Array.isArray(obj_from_json)){
// not an object, stringify using native function
return JSON.stringify(obj_from_json);
}
// Implements recursive object serialization according to JSON spec
// but without quotes around the keys.
let props = Object
.keys(obj_from_json)
.map(key => `${key}:${stringify(obj_from_json[key])}`)
.join(",");
return `{${props}}`;
}
{"foo":"e\":bar"}
:(有效JSON)变为{foo:e:bar"}
(...)!
/\\\"/
可以简化为/\\"/
。不要忘记添加全局标志/\\"/g
,否则它将在具有多个的字符串上中断\"
。至于随机字符,切勿使用文字U + FFFF,以防编辑器窒息,而是转义序列。用于恢复的正则表达式将变为/\uFFFF/g
。
看起来这是您正在寻找的简单的Object toString方法。
在Node.js中,这可以通过使用util对象并调用util.inspect(yourObject)来解决。这将为您提供所需的一切。单击此链接可获取更多选项,包括方法应用的深度。http://nodejs.org/api/util.html#util_util_inspect_object_options
因此,您要找的基本上是对象检查器,而不是JSON转换器。JSON格式指定所有属性必须用双引号引起来。因此,不会有JSON转换器,做你想做的,因为这是根本就不是一个JSON format.Specs这里: https://developer.mozilla.org/en-US/docs/Using_native_JSON
根据服务器的语言,需要字符串对象还是检查对象。
.toSource()
起见,在nodejs中也可以正常工作,但不适用于数组中的对象。该util
检查在数组这是美妙的数组和对象的作品,喜欢它。
util.inspect()
在将对象写入Neo4j查询中时,对我来说真是太棒了,可以一次设置多个参数。
您可以查看由定义JSON格式的人创建的解析器的源代码。寻找函数调用:这些函数用引号引起来的值。键在行326和338处引用。json2.js
quote
修改后不要包括该库。取而代之的是仅取相关(stringify
)部分,或至少JSON
用其他内容代替,例如。FAKEJSON
。
例如,FAKEJSON
仅定义一个对象stringify
:http : //jsfiddle.net/PYudw/
JSON.stringify
,并删除引号。由于该库是由定义JSON的人创建的,因此我们可以确定结果是非常有效的JSON。
.toSource()
效果很好,但不包括如果您的对象位于数组中,这是一个令人毛骨悚然的问题(并且我位于节点上,因此浏览器兼容性不是问题:P),所以我也会使用此方法,感谢@RobW,jsfiddle链接似乎被卡在加载页面上:(
找到了一个很好的NPM软件包来做到这一点:
https://www.npmjs.com/package/stringify-object
const stringify = require('stringify-object')
let prettyOutput = stringify(json);
效果很好。
您的继承语法应该很容易被YAML(这是JSON的超集)吃掉。
尝试使用JavaScript YAML解析器和转储器:http://nodeca.github.com/js-yaml/
@Derek朕会功夫感谢您分享此方法,我想分享支持字符串化对象数组的代码。
export const stringifyObjectWithNoQuotesOnKeys = (obj_from_json) => {
// In case of an array we'll stringify all objects.
if (Array.isArray(obj_from_json)) {
return `[${
obj_from_json
.map(obj => `${stringifyObjectWithNoQuotesOnKeys(obj)}`)
.join(",")
}]` ;
}
// not an object, stringify using native function
if(typeof obj_from_json !== "object" || obj_from_json instanceof Date || obj_from_json === null){
return JSON.stringify(obj_from_json);
}
// Implements recursive object serialization according to JSON spec
// but without quotes around the keys.
return `{${
Object
.keys(obj_from_json)
.map(key => `${key}:${stringifyObjectWithNoQuotesOnKeys(obj_from_json[key])}`)
.join(",")
}}`;
};
JSON.stringify
instanceof Date。'null'
如果obj_from_json
为null,也返回。
if(typeof obj_from_json !== "object" || obj_from_json instanceof Date || obj_from_json === null)
JSON5.stringify
JSON5是JSON的超集,它支持ES5语法,包括未引用的属性键。JSON5参考实现(json5
npm package)提供了一个JSON5
对象,该对象具有与内置JSON
对象相同的方法,并且具有相同的args和语义。
您正在使用的服务很可能正在使用此库。
CSVJSON的JSON Beautifier可以选择删除键上的引号。如果只需要代码,则可以从GitHub存储库复制它。我修改了Douglas Crockford的JSON2以添加对此的支持。
hacked by AnoaGhost