前端给后端传输json数据格式问题

后端同事说前端切图仔你给我传个json回来,我说好的没问题。啪地一下,很快啊,我就把json传过去了(传的是json字符串)。原数据对象如下:

let obj = { 
  member: [
    {id: 1, userid: 8191451, check: true},
    {id: 1, userid: 8200249, check: true},
    {id: 1, userid: 8181572, check: true},
    {id: 1, userid: 8190718, check: true}
  ],
  users: [8191451, 8200249, 8181572, 8190718]
}

使用JSON.stringfy()将obj转换为json字符串,数据如下:
"{"member":[{"id":1,"userid":8191451,"check":true},{"id":1,"userid":8200249,"check":true},{"id":1,"userid":8181572,"check":true},{"id":1,"userid":8190718,"check":true}],"users":[8191451,8200249,8181572,8190718]}"
为了好看,将json字符串写在代码块里

"{"member": [
    {"id":1, "userid":8191451, "check":true},
    {"id":1, "userid":8200249, "check":true},
    {"id":1, "userid":8181572, "check":true},
    {"id":1, "userid":8190718, "check":true}],
  "users": [8191451,8200249,8181572,8190718]
}"

过了一会儿...后端说你这不对啊你怎么给我字符串,你懂不懂json是啥啊!我说懂啊,我传的不就是json字符串么?后端说我不要json字符串,我要json,我要的是这样的...

{"member": [
    {"id":1, "userid":8191451, "check":true},
    {"id":1, "userid":8200249, "check":true},
    {"id":1, "userid":8181572, "check":true},
    {"id":1, "userid":8190718, "check":true}],
  "users": [8191451,8200249,8181572,8190718]
}

所以问题就是,前端给后端传json数据不是传json字符串吗?应该传什么格式? 图2/图3?
ps: 感谢回答

阅读 9.6k
9 个回答

1、把JSON.stringfy()这个去掉,一般框架都会自动把输出的object转成json字符串,前端接收后也会自动将json字符串转成object
2、json就是一个字符串, 一种数据格式,你同事其实想要的是object,一般的http请求库都会自动把json转成object
3、JSON.stringfy()需要转的是所有数据,不然前端没法自动转,如:

    JSON.stringfy({
        code: 200,
        data: {members: []}
    })
    
    // 而不是
    {
        code: 200,
        data: JSON.stringfy({
            members: []
        })
    }
    

肯定默认都是byte,后端要自己处理一次(有的框架会自动处理),不处理解析他使用个鬼。

除非是你把json再字符串了一下,那后端解析完也是字符串啊。

请求header里面需要指定格式为application/json.
JSON.stringify之后的结果不要动(不要管好不好看), 或者直接不使用JSON.stringify一般请求库会自动转。

楼上说的是 让你传递json数据,不是让你搞一个json格式的字符串,这两玩意,接口仔表示差距很大,指定contentType就行了

  1. 检查下前端的请求报文头content-type的取值,上送JSON数据时content-type:application/json
  2. 检查下前端的请求体是不是一个JSON对象(F12看下,浏览器会自动转成JSON对象展示的)。

image.png

如果上述都没有问题,那就找后端同事看看接口为啥没有自动解析

image.png
各位热心回答的朋友,请求已指定Content-Type,后端同事要的是图中attribute为json,我就使用JSON.stringfy()转换了,传过去他又说不是,好像他的意思是要对象... 应该是我们互相理解有误吧?

你2次字符串化了。去掉JSON.stringfy()就好了

{
    "a": {
        "b":"c"
    }
}
{
    "a": "{\"b\":\"c\"}"
}

这两不是一个东西

你是转错了吧,设置Content-Type为json;
并不是要转 obj
obj= {
number: JSON.stringify(number),
users: JSON.stringify(users)
}

这个还是和后端约定一下,
//后台使用对象的形式接受
$.ajax({
url: "testJsonOne",
type: "post",
data: obj,
contentType: 'application/json;charset=utf-8',
success : function(data){
}
});

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题