如何正确的从后台向前台传递多层嵌套的Map(使用Gson序列化为Json的形式)

ltolll 2018-07-06 12:00:24

需求,前台提交查询请求, 后台返回一个Json字符串:

"reJson":{
"errInfo":"错误内容"
"tbData":[
{
"barCode":"a1",
"size":"11"
},
{
"barCode":"a2",
"size":"11"
}
]
}

后台构造Json:首先确定使用什么数据类型, 不想为了"reJson"生成一个用户类, 只能:
HashMap<String,String> reJson = new HashMap<String, String>();

"tbData"中的每个元素都是由键值对组成的jsonObject, 显然可以用HashMap<String,String>
单个元素:
HashMap<String,String> cmdtJson = new HashMap<String, String>();
cmdtJson.put("barCode","a1");
cmdtJson.put("size","11");
接下来需要确定"tbData"的类型,最初使用List<HashMap<String,String>>
tbData.add(cmdtJson);...
但当前台反序列化tbData时取不到对象, 猜测因为在序列化时cmdtJson没有被当成Json字符串处理,而是HashMap<String,String>.
因此序列化改为:
ArrayList<String> tbData = new ArrayList<String>();
tbData..add(gson.toJson(cmdtJson));

结果前台反序列化时每次都要用eval()
比如:
var reJson = eval("(" + reJsonStr + ")")
var tbData = eval("(" + reJson.tbData + ")")
请问这是正常的使用方式吗(为什么觉得别扭),有没有什么办法不用eval, (或者更优雅的方式)?
...全文
624 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
verejava 2018-07-06
  • 打赏
  • 举报
回复
​List和Map混合转换成JSON字符串


http://www.verejava.com/?id=17174277919228
ltolll 2018-07-06
  • 打赏
  • 举报
回复
引用 4 楼 maradona1984 的回复:
不用eval也可以使用JSON.parse
http传输的是字节流,浏览器拿到的响应也是转成字符串,要转成js对象当然要转,跟后端把json字符串转成对象的过程没啥区别


可是以前后台用json.org库的时候返回到前台的json字符串, 仅仅是第一层转对象的时候使用eval, 而嵌套的里层就直接是对象了.
比如:
var resultJson = eval("(" + xhr.responseText + ")");
var reJson = resultJson.reJson;
这里reJson取值的时候就直接得到的是对象.
maradona1984 2018-07-06
  • 打赏
  • 举报
回复
不用eval也可以使用JSON.parse
http传输的是字节流,浏览器拿到的响应也是转成字符串,要转成js对象当然要转,跟后端把json字符串转成对象的过程没啥区别
maradona1984 2018-07-06
  • 打赏
  • 举报
回复
eval少不了,无非是ajax的库替你做了这事还是你自己做的问题
ltolll 2018-07-06
  • 打赏
  • 举报
回复
引用 1 楼 verejava 的回复:
​List和Map混合转换成JSON字符串


http://www.verejava.com/?id=17174277919228


要求使用Gson

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧