网站搜索

TypeScript - JSON 键被双引号 "" 包围和完全没有双引号有什么区别?


这是我的 TypeScript 对象:

{
      first_name:"test",
      last_name: "test",
      birthdate:"2018-01-08T16:00:00.000Z",
      contactNumber: "12312312312",
      email:"[email ",
      username:user."test",
      password: user."test"
}

对

{
    "first_name":"test",
    "last_name": "tests",
    "birthdate":"2018-01-08T16:00:00.000Z",
    "contactNumber": "31231232131",
    "email":"[email ",
    "username":"test",
    "password":"test1234"
}

每次我使用 Angular 5 通过 HTTP POST 发送它时,我的 API 端总是会出错。

这是错误。

未经允许的参数::first_name, :last_name, :birthdate, :contactNumber, :user

当我给所有键添加双引号时,它可以正常工作。

答案#1

根据 JSON 规范(见 http://json.org),你必须用双引号将键括起来。

JSON 对象包含一组字符串/值对,并且字符串定义如下:

字符串是由零个或多个 Unicode 字符组成的序列,用双引号括起来,并使用反斜杠转义。

那是为了让你可以将保留关键字用作键,例如

{
    "function": "sqrt"
}

基本上,键没有用双引号括起来的“JSON”代码不是有效的JSON。

答案#2

答案在 JSON 网站的第一张图中:对象键在 JSON 中必须作为字符串进行编码。如果它们是标识符(不是字符串),那么它就不是 JSON,而是一个字面量的 Javascript 对象。

看起来处理 API 请求的 Ruby 库能够正确理解你发送的数据(一个 Javascript 对象)并将键转换为 Ruby 符号。验证代码期望键是字符串(因为它们是从有效的 JSON 解码的),因此会出现错误信息。