繁体   English   中英

使用 stringify 将 javascript 关联数组转换为 json object,反之亦然

[英]Convert a javascript associative array into json object using stringify and vice versa

我有一个 javascript 关联数组,如下所示

 var my_cars= new Array()
 my_cars["cool"]="Mustang";
 my_cars["family"]="Station Wagon";
 my_cars["big"]="SUV";

我想使用 Stringify 将其转换为 json object。 我想知道转换后 json object 的样子。

另外,当我有这个 object 时,我如何再次将其转换回关联数组。

首先,通过使my_cars成为一个数组并对其进行字符串化,您不会得到您期望的结果。

var my_cars= new Array()
my_cars["cool"]="Mustang";
my_cars["family"]="Station Wagon";
my_cars["big"]="SUV";
alert(JSON.stringify(my_cars));

这会提醒[]

你想要的是从{}开始:

var my_cars= {};
my_cars["cool"]="Mustang";
my_cars["family"]="Station Wagon";
my_cars["big"]="SUV";
alert(JSON.stringify(my_cars));

这提醒

{"cool":"Mustang","family":"Station Wagon","big":"SUV"}

要从字符串中取回 object,请使用JSON.parse()

var s = JSON.stringify(my_cars);
var c = JSON.parse(s);
alert(c.cool);

这会提醒“野马”。

http://jsfiddle.net/Y2De9/

不,但用户想使用数组而不是 json。

普通 JavaScript arrays 旨在保存具有数字索引的数据。 您可以将命名键填充到它们上(当您想要存储有关包含正常、有序、数字索引数据的数组的元数据时,这可能很有用),但这不是它们的设计目的。 JSON 数组数据类型不能在数组上具有命名键。

如果您想要命名键,请使用 Object,而不是数组。

*来源

var test = [];           // Object
test[0] = 'test';        //this will be stringified

现在,如果您想要数组内的键值对

test[1] = {};          // Array
test[1]['b']='item';
var json = JSON.stringify(test);

output

"["test",{"b":"item"}]"

所以你可以使用带有数组的索引,所以或者

var my_cars= [];
my_cars[0]={};
my_cars[0]["cool"]="Mustang";
my_cars[1]={};
my_cars[1]["family"]="Station Wagon";
my_cars[2]={};
my_cars[2]["big"]="SUV";
console.log(JSON.stringify(my_cars));

Output

"[{"cool":"Mustang"},{"family":"Station Wagon"},{"big":"SUV"}]"

将我的评论移到答案中,以便我可以向您展示代码示例。

这些类型的数组在 javascript 中是禁止的。 对于这样的非数字键,您应该只使用 object。 数组索引应该是数字。 Javascript 对象可以为键使用任意值(如您的示例中所示)。 Arrays 碰巧“出现”工作,因为 Arrays 本身就是对象,但您不会发现普通的 Array 方法对它们起作用。 例如,看看这个代码示例。

var my_cars= new Array()
my_cars["cool"]="Mustang";
my_cars["family"]="Station Wagon";
my_cars["big"]="SUV";
alert(my_cars.length);  // alerts 0

您只向底层 object 添加了属性,实际上并未向数组添加元素。 您应该为此使用 Object,而不是数组。 Javascript 实际上没有关联数组。 它有一个 Object,其属性通常可以像使用其他语言的关联数组一样使用。 但是,它是 Object,而不是数组。

“JavaScript 不支持带有命名索引的 arrays”

与关联数组最接近的 state 是一个将条目转换为属性的数组(如您的情况),因此我为这种确切情况提供了解决方案。

有趣的是,Chrome 的控制台让它感觉像是一个关联数组: ["cool":"Mustang", "family":"Station Wagon", "big":"SUV"] (检查F12

注意:在运行代码段之前打开浏览器的控制台

 var my_cars= new Array() my_cars["cool"]="Mustang"; my_cars["family"]="Station Wagon"; my_cars["big"]="SUV"; let toAssociative=(keys, values)=> values.reduce((acc, cv)=>{ acc[acc.shift()]=cv return acc; }, keys) let fromAssociative = (assArr)=>({...assArr}) let serialized = JSON.stringify(fromAssociative(my_cars)) let o = JSON.parse(serialized) let restored = toAssociative(Object.keys(o), Object.values(o)) //NOTE: Look at the browser's console before executing (not SO console) console.log("orig:",my_cars) //[cool: "Mustang", family: "Station Wagon", big: "SUV"] console.log("serialized:",serialized) //{"cool":"Mustang","family":"Station Wagon","big":"SUV"} console.log("restored:",restored) //NOTE: look at the browser's console (F12) //[cool: "Mustang", family: "Station Wagon", big: "SUV"]

If for some reason you cannot convert your array into object, for instance you are working on a big framework or legacy code that you dont want to touch and your job is only to add som feature which requires JSON API use, you should consider using JSON .stringify(json,function(k,v){}) 版本的 API。 在 function 中,您现在可以决定如何处理特定类型的键值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM