如果键不包含在双引号中,JSON 正文将无法读取 [关闭]

问题描述 投票:0回答:1

我手头上有以下问题: 如果我尝试使用以下样式将 json 发送到 api,它可以正常工作:

{ "key": "value", "key": value }

如果我使用以下格式,你似乎总是用JavaScript得到它不起作用:

{ key: "value", key: value }

JSON.stringify 也不起作用,因为它似乎需要一个对象而不是字符串

javascript json
1个回答
-1
投票

JSON 语法非常有限,尽管非常有用。

当然,根据后端的 JSON 解析器,它可以允许使用不带双引号的键,但这将是所述解析器的奇怪行为......对于浏览器

JSON
api 那么你需要保持常规规则(包括双引号键)。

在浏览器级别,您可以使用

JSON.stringify()
将几乎任何实例转换为有效的 JSON 字符串。包括文字。
JSON.parse()
将需要一个有效的 JSON 字符串作为参数,如果该字符串不是有效的 JSON,则计算结果为空值。

const literalString = "my literal string";
const literalNumber = Date.now();
const literalObject = { literalString, literalNumber };

// EXAMPLE 1
const example1 = JSON.stringify(literalString);

// Example 2
const example2 = JSON.stringify(literalNumber);

// Example 3
const example3 = JSON.stringify(literalObject);

// Example 4
const example4 = JSON.stringify(true);

// Example 5 // Invalid use
const example5 = JSON.stringify(class Something {});

console.log
({
  example1, example2, example3, example4, example5,
});
console.log('Parsed Values:');
console.log
({
  example1: example1 ? JSON.parse(example1) : undefined,
  example2: example2 ? JSON.parse(example2) : undefined,
  example3: example3 ? JSON.parse(example3) : undefined,
  example4: example4 ? JSON.parse(example4) : undefined,
  example5: example5 ? JSON.parse(example5) : undefined,
});

addEventListener
(
  'error', errorEvent => console.warn(errorEvent.error.message)
);

console.log('Additional Test:');
console.log(JSON.parse("{key: \"Value\"}"));
.as-console-wrapper { min-height: 100%; }

注意:仍然有一些

JSON.stringify
/
JSON.parse
无法识别的文字,例如
BigInt
、类、函数以及可能更多...但几乎一切都会正常工作。

编辑

JSON.stringify()
接受任何实例(即使它们是内置的)并使用它的可枚举属性来创建该对象的 JSON 版本。碰巧的是,内置构造函数中的大多数实例都没有可枚举的属性,从而导致空对象。

以下是其他示例(包括内置示例):

const instance =
{
  get getter ()
  {
    return 'string';
  },

  // ignored by JSON.stringify()
  method ()
  {
    return 10;
  },

  property: 'value',

  // ignored by JSON.stringify()
  function: function someFunction ()
  {
    return 20;
  }
};

// ignored by JSON.stringify()
const commonArrow = () => {};

// ignored by JSON.stringify()
const commonClass = class { enumerable = 'value'; };

const commonDate = new Date;

const commonError = new Error('some text');

// ignored by JSON.stringify()
const commonFunction = function ()
{
  return 30;
};

const commonObject = new commonClass;

const commonMap = new Map;

const commonSet = new Set;

commonMap.set(commonObject, commonSet);
commonSet.add(commonObject);

addEventListener('error', errorEvent => console.warn(errorEvent.error));

[
  instance,

  commonArrow, commonClass, commonDate, commonError,
  commonFunction, commonObject, commonMap, commonSet,
]
.forEach
(
  item =>
  {
    // Setting an enumerable property to each item.
    item.enumerableProperty = 'value';

    const type = item?.name ?? ( item?.constructor?.name + ' instance' ) ?? typeof item;

    try
    {
      console.log((type + ' (enumerables):'), JSON.stringify(item));
      console.log((type + ' (all properties):'), JSON.stringify(item, allKeys(item)));
    }

    catch ( error )
    {
      console.warn((type + ':'), error.message);
    }
  }
);

function allKeys ( subject )
{
  const keys = [];
  let current = subject;
  
  while ( current != null )
  {
    keys.push(...Reflect.ownKeys(current));
    current = Object.getPrototypeOf(current);
  }
  
  return keys;
}
.as-console-wrapper { min-height: 100%; }

请参阅 文档,了解有关 JSON 如何解析值的更多详细信息(包括神奇的

.toJSON()
方法)。

© www.soinside.com 2019 - 2024. All rights reserved.