Javascript JSON.stringify在属性上不带引号?

Javascript JSON.stringify在属性上不带引号?,javascript,json,Javascript,Json,我使用的服务使用了不正确的JSON格式(属性周围没有双引号)。所以我需要发送 {name:“John Smith”}而不是{name:“John Smith”} 无法更改此格式,因为这不是我的服务 有谁知道使用stringify路由来格式化上述JavaScript对象吗?这个简单的正则表达式解决方案在大多数情况下都可以取消引用JSON属性名称: const object={name:'John Smith'}; const json=json.stringify(对象);//{“姓名”:“约翰

我使用的服务使用了不正确的JSON格式(属性周围没有双引号)。所以我需要发送

{name:“John Smith”}
而不是
{name:“John Smith”}

无法更改此格式,因为这不是我的服务


有谁知道使用stringify路由来格式化上述JavaScript对象吗?

这个简单的正则表达式解决方案在大多数情况下都可以取消引用JSON属性名称:

const object={name:'John Smith'};
const json=json.stringify(对象);//{“姓名”:“约翰·史密斯”}
log(json);
const unquoted=json.replace(/“([^”]+)”:/g,$1:”;

console.log(unquote);//{name:“John Smith”}
您可以查看由定义JSON格式的人创建的解析器的源代码。查找
quote
函数调用:这些调用用引号围绕一个值。键在第行和第行中引用

修改后不要包含库。而只使用相关的(
stringify
)部分,或者至少用其他内容替换
JSON
,例如
FAKEJSON


例如,一个对象
FAKEJSON
,它只定义了
stringify

尝试将服务与JSONP一起使用,我想他们在使用这种格式时会提供它

否则,向他们提交一份详细的bug报告,包括一个很好的论证,说明为什么应该符合标准。除了消除源问题之外,任何其他解决方案都不是真正的解决方案

快速修复方法可能是在解析字符串之前通过正则表达式对其进行管道传输:

var obj = JSON.parse(str.replace(/(\{|,)\s*(.+?)\s*:/g, '$1 "$2":'));

或者,如果您想要更具语法性的解析,您可以尝试调整现有的javascript JSON解析器(如)。

您继承的语法应该很容易被YAML所接受,YAML是JSON的超集


尝试JavaScript YAML解析器和转储程序:

看起来这是您正在寻找的一个简单的Object-toString方法

在Node.js中,这可以通过使用util对象并调用util.inspect(yourObject)来解决。这将为您提供所需的一切。有关更多选项,包括方法应用的深度,请参见此链接

因此,您所寻找的基本上是一个对象检查器,而不是JSON转换器。JSON格式指定所有属性必须用双引号括起来。因此,不会有JSON转换器来执行您想要的操作,因为这根本不是JSON格式。这里的规范:


根据服务器的语言,您需要字符串对象或检查对象。

有一个在键上加引号的选项。如果您只需要代码,您可以从GitHub repo复制它。我要添加对它的支持。

找到一个很好的NPM包来实现这一点:


效果很好。

@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(",")
            }}`;
};
使用
JSON5.stringify
是JSON的超集,允许ES5语法,包括不带引号的属性键。JSON5引用实现()提供了一个
JSON5
对象,该对象具有与内置
JSON
对象相同的参数和语义的相同方法

您正在使用的服务很可能正在使用此库。

TL;DR--代码 下面是关于浏览器中的lookback支持的警告,现在您可以开始:

function cleanIt(obj) {
    var cleaned = JSON.stringify(obj, null, 2);

    return cleaned.replace(/^[\t ]*"[^:\n\r]+(?<!\\)":/gm, function (match) {
        return match.replace(/"/g, "");
    });
}
我编辑了他的。这是有效载荷:

var obj = {
  name: "John Smith",
  favoriteObjects: [
    { b: "there's", c: "always", d: "something" },
    [1, 2, "spam", { f: "hello" }],
    { vowels: "are missing" },
  ],
  favoriteFruits: ["Apple", "Banana"],
};
以下是空白输出:

{
  name:"John Smith",
  favoriteObjects:[
    {
      "b":"there's",    <<< Major
      "c":"always",     <<< fails
      "d":"something"   <<< here
    },
    [
      1,2,"spam",
      {
        "f":"hello"     <<< and here.
      }
    ],
    {
      "vowels":"are missing" <<< again.
    }
  ],
  favoriteFruits:["Apple","Banana"] <<< that worked!
}
调用表示“stringify
x
(第一个参数),而不使用花哨的替换函数(由
null
的第二个参数指示),在序列化的每个深度级别上有两个(第三个参数
2
)空格。”该
2
还为每个属性购买了单独的行

{
  "name": "John Smith",
  "favoriteObjects": [
    {
      "b": "there's",
      "c": "always",
// etc...
现在每个键都很好地位于一行的开头。这是我们可以处理的。


现在清除键的引号 让我们创建一个正则表达式,它查找键,并且只查找键,并提取它们周围的
。因为我们知道现在钥匙都在自己的线路上,所以事情就简单多了

唯一真正的问题是属性的值是否包含中间的
。这可能会把事情搞砸

"a": [
    "This could \": be bad",
    "QQ"
]
事后警告 我想用a解决这个问题,但放弃了,使用了负面查找。2018年后,负面查找仅受一部分浏览器支持。(浏览器兼容性的说明可在“查找断言”下)


RegEx解释说: 在jadent提出要求后的短短八年半内,QED就完成了。这就是服务



快速更新:如果您不一定需要在代码中实现这一点(尽管在某些用例中,您也可以直接调用此库),则更好的答案可能是使用,它可以完美地清理东西。

-1也不是我,但您必须仔细阅读问题。OP需要将对象编码为(断开的)json,不是解析/计算它。@Derek此方法不可靠。例如,以以下输入为例:
{“foo”:“e\”:bar}
(有效的json)变成
{foo:e:bar}
(…)!@Derek
/\\\“/
可以简化为
/\\”/
。别忘了添加全局标志,
/\\”/g
,或者它将在具有多个
\“
的字符串上中断。对于随机字符,如果编辑器阻塞,请不要使用文字U+FFFF,而是使用转义序列。用于还原的正则表达式将变为
/\uFFFF/g
@Derek朕會功夫 您的正则表达式
/\”([^(\”)“]+)\”:/g
可以简化为
/”([^“]+)”:/g
,请参见@endriu。在这种情况下,只需添加一个额外的空值检查。当您可以在纯JavaScript中执行此操作时,为什么还需要一个额外的库?这是一个好主意。我将分叉repo,删除引号,并将JSON对象重命名为FAILJSON之类的搞笑对象,以明确您没有使用实际的JSON对象或实际的JSON。@Derek库不应该
var cleaned = JSON.stringify(x, null, 2);
{
  "name": "John Smith",
  "favoriteObjects": [
    {
      "b": "there's",
      "c": "always",
// etc...
"a": [
    "This could \": be bad",
    "QQ"
]
/^[\t ]*"[^:\n\r]+(?<!\\)":/gm
{
  name: "John Smith",
  favoriteObjects: [
    {
      b: "there's",
      c: "always",
      d: "something"
    },
    [
      1,
      2,
      "spam",
      {
        f: "hello"
      }
    ],
    {
      vowels: "are missing"
    }
  ],
  favoriteFruits: [
    "Apple",
    "Banana"
  ]
}