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

时间:2011-08-17 07:15:38

标签: javascript json

我有一个javascript关联数组,如下面的

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

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

当我有这个对象时如何将它再次转换回关联数组。

5 个答案:

答案 0 :(得分:49)

首先,通过使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"}

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

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

警告“野马”。

请参阅http://jsfiddle.net/Y2De9/

答案 1 :(得分:4)

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

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

如果需要命名键,请使用Object,而不是Array。

* source

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

现在,如果你想在数组中使用键值对

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

输出

"["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));

输出

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

答案 2 :(得分:3)

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

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

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

您只向基础对象添加了属性,而不是实际向Array添加了元素。您应该为此使用Object,而不是Array。 Javascript实际上没有关联数组。它有一个Object,它的属性通常可以像在其他语言中使用Associate Array一样使用。但是,它是一个对象,而不是一个数组。

答案 3 :(得分:2)

"JavaScript does not support arrays with named indexes"

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

有趣的是,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"]

答案 4 :(得分:0)

如果出于某种原因你无法将你的数组转换为对象,例如你正在处理一个你不想触及的大框架或遗留代码而你的工作只是添加需要使用JSON API的som功能,你应该考虑使用API​​的JSON.stringify(json,function(k,v){})版本。 在函数中,您现在可以决定如何处理key的值是特定类型。