发送嵌套的json格式,对方接收报错!
现在遇到的问题是我发json给后端,后端收到后报错,后端说我发的json格式有问题,或者是序列化后出问题,我用js写的,应该所有json格式都是一样的,无论前端和后端用什么语言。
问题分析如下:
json工具检查推荐:https://www.sojson.com/
前端和后端定义的JSON格式(用json工具检测为合法):
{
"ip": "192.168.0.1",
"userTxt": 1,
"userType": 0,
"mydata":
{
“neirong”:””,
”id”:”5”,
”zhanghao”:”ceshi”,
”mima”:”123456”
}
}
xx.js代码如下(简单的登陆界面获取):
var zhanghao=window.document.getElementById("zhanghao").value; //获取输入账号信息
var mima=window.document.getElementById("mima").value; //获取用户输入密码信息
//这个是定义的json格式,里面还嵌套的json格式mydata
let data = {
"ip": "192.168.0.1",
"userTxt": 1,
"userType": 0,
"mydata": {“neirong”:”12345”,”id”:””}
}
//因为用户输入的账号和密码都是变量,所以不能直接写再json里,会报错
//我们想把账号和密码变量插入进去(知识点)
data .mydata.UserAccount = username;
data .mydata.UserPassword = password;
//然后对json进行序列化,js的序列化方法是:
var send = JSON.stringify(data); //json转换为字符串
console.log("发送数据(转换后):" + sendStr); //打印出来转换后发送的内容是不是字符串
ws.send(sendStr);
这里发送给后端,问题来了,后端收到后他那里报错,他跟别的socket通信时OK的,,但是跟我webscoket通信出问题,是通信问题?还是我的json有问题?
他收到的内容是原内容,所以跟通信没有关系,但为何报错,我反复检查了我写的json格式都没有问题,没有问题,那是我序列化出问题了?Js序列化转换就这样啊!
网上在线json格式转换生成自定义类型试试,注意看:private Mydata mydata;
在线转换工具:https://www.bejson.com/json2javapojo/new/
发现我发送给后端接收的madata是对象Mydata类型(也就是嵌套的json格式序列出问题了,或者说是没有序列化),因为后端定义的mydata是String类型(private String mydata;),我们发过去的是对象,它定义的是String类,可js没有定义啊,都是var和let来定义类的,这个问题让后端把mydata修改成对象,可它还要和其他人通信,改了可能不方便,前端怎么修改?我想到的是对于嵌套的json单独提取出来先序列号再导入:
var zhanghao=window.document.getElementById("zhanghao").value; //获取输入账号信息
var mima=window.document.getElementById("mima").value; //获取用户输入密码信息
/* 发送数据给后端处理 */
//先把mydata单独提取出来
let mydata= {
"UserName":"",
"UserType":"1",
}
//把变量插进去,嵌套方式
mydata.zhanghao= zhanghao;
mydata.mima= mima;
//对mydata的嵌套进行序列化
var mysend = JSON.stringify(mydata);
let data = {
"ip": "192.168.0.1",
"userTxt": 1,
"userType": 0,
"mydata": mysend //这个把上面序列化后的mysend放进来
}
//对大的json序列化
var sendStr = JSON.stringify(data);
//这样发送过去的json就不会报错了。
console.log("发送数据(转换后):" + sendStr);
ws.send(sendStr); //发送给后端
总结:对于json里面还嵌套的json,单独提取出来子json先序列化 JSON.stringify(xxxx),再放入主json里。
最主要的是双方间要相互沟通解决。