将对象数组和嵌套数组转换为JSON

时间:2016-10-28 17:12:04

标签: javascript php json api

我有一个API端点,需要以下json字符串(这是一个例子)。

{
    "userid": "1234",
    "bookshelf": "3",
    "bookcount": "6",
    "books":[
        {"bookid": "1"},
        {"bookid": "2"},
        {"bookid": "3"},
        {"bookid": "6"}
]}

api以下列方式访问每个:

$userid = $data['userid'];
$bookshelf = $data['bookshelf'];

...等 我还可以遍历书籍并获得每个bookid:

$data['books'][$i]['bookid']

当我通过像邮递员这样的工具发送上面的json字符串时,它工作正常。我在javascript方面制作这个相同的json字符串时遇到了麻烦。这就是我填充网站前端数据的方式。

var data = new Array();
data.push({ "userid": "1234" });
data.push({ "bookshelf": "3" });
data.push({ "bookcount": "6" });
data.push({ "books": selectedbooks }); // This is an array of bookid objects

问题在于我是否json.stringify它并发送到web服务器并发送到api或具有web服务器json_encode,我最终得到的数字索引只有在被$data[0]['userid'];解码后才能被访问。 api,与api的工作方式不同。如果api支持它,则需要以精确的顺​​序组装json字符串。

如何以所需格式获取此数据?

4 个答案:

答案 0 :(得分:2)

数字索引即将到来,因为您正在将数据准备为数组,而不是对象。 JavaScript中的数组是索引的,而不是关联的。尝试:

var data = {
    userid: 1234,
    bookshelf: 3,
    bookcount: 6,
    books: selectedbooks
};

答案 1 :(得分:1)

您需要创建一个对象,而不是数组。

var data = {};
data["userid"] = "1234";
data["bookshelf"] = "3";
data["bookcount"] = "6";
data["books"] = selectedbooks; // This is an array of bookid objects

答案 2 :(得分:1)

您的数据不应该是数组,它是一个对象。唯一的数组位于books属性中。

var data = {}
data.userid = "1234";
data.bookshelf = "3";
data.bookcount = "6";
data.books = selectedbooks;

或更多succintly:

var data = {
    userid: "1234",
    bookshelf: "3",
    bookcount: 6,
    books: selectedbooks
};

答案 3 :(得分:0)

您可以轻松地将数组转换为预期的对象:

var arr = [
    {"userid": "1234"},
    {"bookshelf": "3"},
    {"bookcount": "6"},
    {
       "books":[
         {"bookid": "1"},
         {"bookid": "2"},
         {"bookid": "3"},
         {"bookid": "6"}
    ]}
];
var obj = {} ;
arr.forEach(item => {
  var key = Object.keys(item)[0];
  obj[key] = item[key];
});
console.log(obj); 
//{ userid: '1234',
//  bookshelf: '3',
//  bookcount: '6',
//  books: 
//   [ { bookid: '1' },
//     { bookid: '2' },
//     { bookid: '3' },
//     { bookid: '6' } ] }