使用 JSON.stringify 时不需要的数组索引

     2023-02-24     256

关键词:

【中文标题】使用 JSON.stringify 时不需要的数组索引【英文标题】:Unwanted array indexes when using JSON.stringify 【发布时间】:2012-02-11 09:04:27 【问题描述】:

我使用JSON.stringify 方法将数组传递给服务器。

我有一个包含 4 个元素的数组:

arr[10] = 1;
arr[20] = 1;
arr[30] = 1;
arr[40] = 1;

然后我这样做:

arr = JSON.stringify(arr);

然后发送到服务器:

                jQuery.ajax(
                    type: "post",
                    url: baseurl+"profile/mprofile/action/ratings/add_ratings",
                    data:"checkbox":checkbox,"review":review,"speciality":speciality,"arr":arr,
                    success: function(data, status)   

                        jQuery('#header-error').html(data);
                     
                ); 

我在 PHP 中获取数组:

    $arr = $this->ci->input->post('arr');
    $arr = json_decode($arr);
    print_r($arr) ; die ;

结果是

Array
(
    [0] => 
    [1] => 
    [2] => 
    [3] => 
    [4] => 
    [5] => 
    [6] => 
    [7] => 
    [8] => 
    [9] => 
    [10] => 1
    [11] => 
    [12] => 
    [13] => 
    [14] => 
    [15] => 
    [16] => 
    [17] => 
    [18] => 
    [19] => 
    [20] => 1
    [21] => 
    [22] => 
    [23] => 
    [24] => 
    [25] => 
    [26] => 
    [27] => 
    [28] => 
    [29] => 
    [30] => 1
    [31] => 
    [32] => 
    [33] => 
    [34] => 
    [35] => 
    [36] => 
    [37] => 
    [38] => 
    [39] => 
    [40] => 1
)

为什么会这样?

【问题讨论】:

【参考方案1】:

这就是 javascript 数组的工作方式。当您将值设置为超出范围的索引时,数组会展开,值会成功设置,并且所有“缺失”值都会设置为 undefined

您被混合了数组和字典(或“关联数组”,在 PHP 谈话中)之间的差异的 PHP 行为宠坏了。

为避免这种行为,只需在 javascript 中创建字典而不是数组。

var arr = ;
arr[10] = 1;
arr[20] = 2;

此外,在 PHP 方面,您应该将 true 作为第二个参数传递给 json_decode

json_decode($arr, true)

这将使它返回数组而不是标准类。

【讨论】:

+1,尽管您可能想在 php 端添加,需要将 json_decode 的第二个参数设置为 true,否则您最终会得到 stdclass 对象而不是数组。跨度> 确实如此。对象和数组是两个不同的东西。不要忘记基础知识。【参考方案2】:

你如何初始化arr?您可能想要使用对象而不是数组。例如:

var arr = ;
arr[10] = 1;
arr[20] = 1;
arr[30] = 1;
arr[30] = 1;
var jsonified = JSON.stringify(arr);
console.log(jsonified);

【讨论】:

【参考方案3】:

JavaScript 中的数组的工作方式与 PHP 中的有些不同。您实际上并没有一个包含 4 个元素的数组,而是一个包含 41 个元素的数组从一开始就。例如,当您说arr[ 10 ] = 1 时,0 到 9 之间的每个数组元素都会自动分配为undefined

我建议你换个逻辑:不要使用数组键来跟踪值,而是使用数组值:

arr = [ 10, 20, 30, 40 ];

或者,如果您需要二进制值以外的值,请使用对象:

arr = [
     score: 10, value: 1 ,
     score: 20, value: 5 
];

【讨论】:

JSON.stringify() 数组的怪异与 Prototype.js

】JSON.stringify()数组的怪异与Prototype.js【英文标题】:JSON.stringify()arraybizarrenesswithPrototype.js【发布时间】:2012-11-2502:06:51【问题描述】:我正在尝试找出我的json序列化出了什么问题,将我的应用程序的当前版本与旧版本一起使用... 查看详情

js数组使用json.stringify和tostring的区别

js中eval()和$.parseJSON()的区别以及JSON.stringify()1.第一个区别是:安全性json格式非常受欢迎,而解析json的方式通常用JSON.parse()但是eval()方法也可以解析,这两者之间有什么区别呢?JSON.parse()之可以解析json格式的数据,并且会对要解... 查看详情

如何在不使用 JSON.stringify 或 JSON.parse 的情况下在 javascript 中克隆数组? [复制]

】如何在不使用JSON.stringify或JSON.parse的情况下在javascript中克隆数组?[复制]【英文标题】:HowtocloneanarrayinjavascriptwithoutusingJSON.stringifyorJSON.parse?[duplicate]【发布时间】:2014-11-0521:10:30【问题描述】:我有一个数组示例fruit。我想将... 查看详情

json.stringify详解

参考技术A当我们使用JSON.stringify()序列化一个值为JSON字符串,只有JSON安全的值才可以通过JSON.stringify()转换为字符串。那么,什么是JSON安全的值?能够有效用JSON形式表示的任何值。非JSON安全的值,例如:undefined、function和symbol... 查看详情

如何正确使用 JSON.stringify 和 json_decode()

】如何正确使用JSON.stringify和json_decode()【英文标题】:howtouseJSON.stringifyandjson_decode()properly【发布时间】:2013-04-0520:36:46【问题描述】:我试图通过以下方式将多维Javascript数组传递到我网站上的另一个页面:在数组上使用JSON.strin... 查看详情

在没有序列化程序的对象上使用 JSON.stringify 需要标记为实验性

】在没有序列化程序的对象上使用JSON.stringify需要标记为实验性【英文标题】:UsingJSON.stringifyonobjectwithoutserializerneedstobemarkedasexperimental【发布时间】:2019-05-0713:22:44【问题描述】:在AndroidStudio中使用kotlin插件1.3.10,当我尝试将... 查看详情

如何 JSON.stringify 对象数组

】如何JSON.stringify对象数组【英文标题】:HowtoJSON.stringifyanarrayofobjects【发布时间】:2016-05-0700:44:08【问题描述】:我正在尝试JSON.stringify()以下键/值对,其中值是对象数组。varstring=JSON.stringify(onlineUsers:getUsersInRoom(users,room));这是... 查看详情

json对象

JSON对象  常用方法:  1.JSON.stringify()序列化数组,对象等  2.JSON.parse()反序列化 使用场景  ajax与后端进行数据传递时,极其重要  比如:在nodejs中,需要将从数据库中查找的数组传递到前端,此时需要将数组序... 查看详情

小tips:qs.stringify()和json.stringify()的区别以及在vux中使用post提交表单数据需要qs库序列化

...列化。假设我要提交的数据如下vara={name:‘hehe‘,age:10};qs.stringify序列化结果如下name=hehe&age=10而JSON.stringify序列化结果如下:"{"a":"hehe","age":10}"vux中使用post提交表单数据:this.$htt 查看详情

使用json.stringify向我的json对象添加一个额外的和“”(代码片段)

嗨我正在使用Javascript创建一个带有键和对象的数组,使用以下代码。ValuesArray.push(key:$(this).attr('someattribute'),value:$(this).val());结果我有这样的对象数组:key:29;value:'Country'Key:12;value:'4,3,5'当我试图对它进行字符串化并在帖子中发送JS... 查看详情

如何 JSON.stringify 嵌套的对象数组 [关闭]

】如何JSON.stringify嵌套的对象数组[关闭]【英文标题】:HowtoJSON.stringifyannestedarrayofobjects[closed]【发布时间】:2020-07-1907:12:57【问题描述】:这是我的数据,data="SeatingArrangement":["data":["id":1,"rowName":"a","seatNo":0,"id":2,"rowName":"a","seatNo": 查看详情

vue表单form数据转化为json字符串

参考技术AJSON.parse()与JSON.stringify()的作用JSON.parse():将json字符串转化为对象JSON.stringify():将js值转化为json字符串使用场景:一、路由需要传对象作为参数时二、在缓存中存储对象(数组、字典等)三、判断数组、字典或其他对象是否... 查看详情

功能比json.stringify强大的stringify(亲测好用)(代码片段)

介绍        写了一个能将对象或数组转换成字符串(内部能转义多种数据类型)的函数,供大家使用。        原理是把值转化为js代码字符串,再利用eval()函数把字符串转化为对象或数组,实现深拷... 查看详情

010天json.stringify()详解(代码片段)

JSON.stringify()除了要序列化的js对象外,还可以接受另外两个参数,这两个参数用于指定以不同的方式序列化js对象。第一个参数是个过滤器,可以是一个数组,也可以是一个函数;第二个参数是一个选项,表示是否在JSON字符串中... 查看详情

json.stringify

JSON.stringify(value[,replacer][,space]) value:是必选字段。就是你输入的对象,比如数组,类等。 replacer:这个是可选的。它又分为2种方式,一种是数组,第二种是方法。   情况一:replacer为数组时,通过后面的实验可以... 查看详情

qs.stringify、qs.parse、json.stringify的使用和区别

...安装,是一个npm仓库所管理的包。importqsfrom'qs'而qs.stringify()将对象序列化成URL的形式,以&进行拼接。如图qs.parse()将URL解析成对象的形式JSON是正常类型的JSON JSON.stringify同qs.stringify()对比,功能虽然是都是序列化,但是... 查看详情

如何删除嵌套的 JSON.stringify() 属性

】如何删除嵌套的JSON.stringify()属性【英文标题】:HowtoremovenestedJSON.stringify()properties【发布时间】:2017-08-2618:05:38【问题描述】:我正在尝试使用Typescript修改字符串。该字符串由JSON.stringify()方法创建。我想删除"inputPort"的属性"id... 查看详情

js数组转换成json串(json.stringify)

例如:var giftlist[1490011777]=[];giftlist[1490011777][‘id‘]= 1490011777;giftlist[1490011777][‘name‘]= "礼包测试";giftlist[1490011777][‘desc‘]= "详情"; 转换json串varjsonStr=JSON.stringify 查看详情