我正在使用React和fetch,而我正在尝试将JSON字符串发送到客户端的Web服务,他们期待这样的对象:
{
"id":"1",
"plan_id":"6",
"plan_start_date":"2017-08-02",
"months":"1",
"extra_hours":"4",
"attendees":"1",
"mails":"",
"shopping_cart_id":"0"
}
但是,每当我使用JSON.stringify()生成JSON字符串时,结果都是这样的:
"{
"id":"1",
"plan_id":"6",
"plan_start_date":"2017-08-02",
"months":"1",
"extra_hours":"4",
"attendees":"1",
"mails":"",
"shopping_cart_id":"0"
}"
因此,当发送请求时,我收到一条错误,指出该对象无效。
有没有办法像第一个例子那样发送对象?我已经尝试手动构建对象,但我无法将密钥的名称保留在引号中。
编辑:来电代码如下:
addToCart(plan) { //Plan is the object with the previous example's structure
fetch("http:ClientWS", {
method: "POST",
body: JSON.stringify(plan) //Produces the "{}" issue
})
.then(response => response.json())
.then(json => {
//Read the response info, here it tells me that the value for 'id' is invalid
console.log(json.datos);
}).catch(function(ex) {
console.log(ex);
});
}
答案 0 :(得分:0)
这是因为JSON.stringify通过将所有属性和值连接在一起并插入一些分隔符来获取对象并输出 string 变量。并且字符串显示在引号中,因为它是一个字符串。它不再是一个对象。当您将其发送到服务器时,服务器将其视为单个字符串值。不考虑字符串的内容看起来像JSON这一事实。
你知道JSON和JavaScript对象本质上是一回事吗?您可以看到的字符串化JSON只是对象结构的人类可读版本。它也是一种方便的格式,用于序列化对象(来自所有语言而不仅仅是JS),以便在HTTP请求中传输(或者在文件或数据库中存储,以及其他用途)。
所以实际上当您将对象发送到服务器时,请执行此操作 - 发送对象。如果您是通过ajax进行的,那么您使用的JS代码通常会将其序列化以便代表您进行传输。您可能必须设置正确的内容类型标头。 HTTP请求主体内部的序列化对象最终看起来很像JSON.stringify的输出(例如,如果您在浏览器的网络选项卡中查看它),除非它实际上不是字符串,服务器将将it correclty解释为包含多个属性的对象。
答案 1 :(得分:0)
JSON.stringify()不在输出周围添加额外的引号。如果您看到这些额外的引号,我会说这意味着错误在其他地方。