【问题标题】:JSON.stringify returning []JSON.stringify 返回 []
【发布时间】:2011-11-07 18:03:41
【问题描述】:

为什么JSON.stringify()会返回:

[]

jQuery 也是如此:$.JSON.encode()

是什么原因造成的?我传入一个简单的对象数组,其中每个对象都有字符串属性。我已经遍历并提醒了每个对象的属性,一切看起来都很好,但由于某种原因,两个编码方法都返回 []

【问题讨论】:

  • JSON.stringify([]) === "[]"。您的对象数组可能是空的。
  • 不必为空,但不可枚举的元素。
  • 我已经解决了,它是字符串数组键。再过 8 小时无法发布我自己的答案。
  • 顺便说一句,数组没有字符串键。曾经。根据定义。听起来你通过假装它是一个对象来破坏一个数组(即@evilpie 所说的);不要这样做。
  • "顺便说一句,数组没有字符串键。"数组只是普通对象,但我同意你应该避免滥用它们。

标签: javascript jquery json


【解决方案1】:

我遇到了同样的问题,因为我的 json 数组键值是字符串。不可能改变结构。所以我通过将我的 json 数组转换为 json 对象,它完全解决了我的问题。 Json 对象成功字符串化。

将数组更改为对象:

var *your_object* = Object.assign({}, *your_array*);

【讨论】:

  • 我有一个无法字符串化的数组 [OCX938: "fgdgdfgfdgfdgdf"]。这样就解决了问题
  • 我有一个对象 {5666440609949: true, 5638880067741: true},这种方法为我解决了这个问题
【解决方案2】:

如果您的数组使用 string 键值,而不是 int,则 stringify 会忽略该值。

var array = [];
array['name'] = 'johan';
array['age'] = 20;
alert(JSON.stringify(array))// return []

但如果数组使用“int”作为键,则stringify 将返回它。

var array = [];
array[0] = 'johan';
array[1] = 20;
alert(JSON.stringify(array))// return["johan",20]

【讨论】:

  • 你救了我。非常感谢!
  • 如果我想将键作为字符串怎么办?!
  • 你可以使用对象类型而不是数组:var obj = { name: "John", age: 20, city: "New York" }; alert(JSON.stringify(obj));
【解决方案3】:

虽然上面的答案都是正确的,但要完全理解它肯定需要更多的上下文。

JSON 是一种通用格式(在支持多种,希望是所有编程语言的意义上),它不完全是 JavaScript 对象的一对一映射。

所以发生这种情况的根本原因是在 JSON 中(由 RFC 7159 指定)在 JavaScript 的 Array 意义中没有关联数组——即键是字符串的数组。由于阅读 RFC 规范可能相当耗时,因此可以在上面提到的 JSON.org 网站上最容易地看到它(下面的一些重点是我的):

JSON 建立在两种结构之上:

  • 名称/值对的集合。在各种语言中,这被实现为 objectrecordstructdictionaryhash table 键控列表关联数组
  • 值的有序列表。在大多数语言中,这被实现为 arrayvectorlistsequence em>。

这些是通用数据结构。几乎所有现代编程语言都以一种或另一种形式支持它们。可以与编程语言互换的数据格式也基于这些结构是有意义的。

在 JSON 中,它们采用以下形式:

object 是一组 无序 名称/值对。对象以{(左大括号)开头,以}(右大括号)结尾。每个名称后跟:(冒号),名称/值对用,(逗号)分隔。

数组是值的有序集合。数组以[(左括号)开头,以](右括号)结尾。值由,(逗号)分隔。

JSON.stringify 函数以这样的方式处理这个问题,假设数组是一个数组,并且所有键控条目都是注释性的,就像作为函数对象的元素一样,它们只是被从 JSON 表示中抛出返回。不幸的是,截至今天(2017 年 9 月 4 日),在非官方的 JavaScript 参考文献MDN 中没有以定义明确且易于理解的方式记录这种行为,所以如果你想帮助 ol,这里有一些唾手可得的果实Mozilla。

【讨论】:

  • 这是给我的正确答案:仅在 json 上使用数字索引。
【解决方案4】:

在你的数组声明中

var count_review= new Array() 

而不是这个用途

var count_review={}; 

有效!

【讨论】:

  • 这两行不一样。第一个是数组,第二个是对象。数组:var count_review = [];...
  • 如果你使用 JavaScript 对象作为关联数组(也就是使用字符串键而不是 int 键),这个答案是正确的。
  • 在这种情况下使用var my_array = [] 对我不起作用(Android Cordova)。确保使用var my_array = {},即使之后传递一个数组。这样做解决了问题。
  • 我在连接 Promise.reduce 中的对象时发生了这种情况。需要将初始值设置为 {},然后修复它。
  • 那行得通。我已经用 somearray = [] 初始化了我的“数组”,然后用对象(键值对)填充它,然后尝试用 stringify 检索。它每次都给我返回一个空数组。使用 {}(作为对象)以正确的方式初始化它解决了这个问题。看来我缺乏一些关于数组和对象之间差异的基本知识。
猜你喜欢
  • 1970-01-01
  • 2016-09-02
  • 2015-01-24
  • 1970-01-01
  • 2017-12-30
  • 2020-11-12
  • 2015-11-11
  • 2011-11-27
  • 2014-02-02
相关资源
最近更新 更多