繁体   English   中英

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

[英]Converting array of objects and nested array to JSON

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

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

api以以下方式访问每个:

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

等等...我还可以浏览这些书,并获得每个书号:

$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'];这样访问的数字索引$data[0]['userid']; 一旦由api解码,则与api的工作方式不同。 如果api支持的话,这将要求json字符串以正确的顺序进行组装。

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

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

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

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

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

您的数据不应是数组,而应是对象。 唯一的数组在books属性中。

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

或更简洁地:

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

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

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' } ] }

暂无
暂无

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

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