tojson报内存溢出报错怎么解决

EJB中Gson使用tojson()出现的一系列问题
今天在写EJB服务端代码,(ˇ_ˇ) 想在客户端与服务器之间通过Json传List&User&对象,出现如下错误,并给出我自己的解决方法
1.服务端---无法将List对象转为String,正常的List都可以转的
Gson gson=new Gson();
List&User& users=query.getResultList();
return gson.toJson(users);
原因:网上说User对象中存在Lazy懒加载设置,设为EAGER即可,但我试了下对我的代码不起作用
解决方案:
使用自定义的gson配置,不使用默认的,如何配置请看博客相关文章。
&span style="color:#FF0000;"&Gson gson = new GsonBuilder().registerTypeHierarchyAdapter(User.class, new MyTypeAdapter&User&()).create();&/span&
List&User& users=query.getResultList();
return gson.toJson(users);
&span style="color:#FF0000;"&MyTypeAdapter类文件
public class MyTypeAdapter&T& extends TypeAdapter&T& {
public T read(JsonReader reader) throws IOException {
public void write(JsonWriter writer, T obj) throws IOException {
if (obj == null) {
writer.nullValue();
writer.value(&span style="color:#FF0000;"&obj.toString()&/span&);
这样服务端String对象就可以传到客户端了
2.值可以传了但是,传过来的不是json格式的--[bean.user@sadasd,bean.user@],导致客户端使用如下代码无法转为User
Type type = new TypeToken&ArrayList&User&&(){}.getType();
List&User& us=new ArrayList&&();
us=gson.fromJson(users, type);
原因:是因为服务器端自己配置的gson--obj.toString()
解决方法:重新User的toString()方法
//[{"userId":0,"name":"fh","ip":"1","value":1},{"userId":0,"name":"fh1","ip":"1","value":1}]
public String toString() {
return "{userId:" + userId + ", name:" + name + ", ip:" + ip
+ ", value:" + value+"}" ;
这样就可以得到正确的json格式,就可以成功转换为User
没有更多推荐了,关于数据序列化(4),FastJson的两个bug
fastJson循环引用引发一个bug
fastJson可以将一个对象序列化为json,也可以通过反序列化出一个完整的对象。且支持循环引用。
package com.sincetimes.website.core.common.
import com.sincetimes.website.core.common.vo.ToStringA
/** ::new */
public class DataSimpleVO {
public Object value1;
public DataSimpleVO() {
public DataSimpleVO(String name, Object value) {
this.name =
this.value =
public String toString() {
return "DataSimpleVO [name=" + name + ", value=" + value + ", value1=" + value1 + "]";
DataSimpleVO a = new DataSimpleVO("a", 1)
DataSimpleVO b = new DataSimpleVO("b", 2)
b.value = a
Map&String, Object& map = new HashMap&&()
map.put(a.name, a)
b.value1 = map
String jsonStr = JSON.toJSONString(b)
System.out.println(jsonStr)
DataSimpleVO obj = JSON.parseObject(jsonStr, DataSimpleVO.class)
System.out.println(obj.toString())
{"name":"b","value":{"name":"a","value":1},"value1":{"a":{"$ref":"$.value"}}}
DataSimpleVO [name=b, value={"name":"a","value":1}, value1={"a":{"name":"a","value":1}}]
反序列化成功
改一下代码
DataSimpleVO a = new DataSimpleVO("a", 1)
DataSimpleVO b = new DataSimpleVO("b", 2)
b.value1 = a
Map&String, Object& map = new HashMap&&()
map.put(a.name, a)
b.value = map
String jsonStr = JSON.toJSONString(b)
System.out.println(jsonStr)
DataSimpleVO obj = JSON.parseObject(jsonStr, DataSimpleVO.class)
System.out.println(obj.toString())
{"name":"b","value":{"a":{"name":"a","value":1}},"value1":{"$ref":"$.value.a"}}
DataSimpleVO [name=b, value={"a":{"name":"a","value":1}}, value1=null]
b中的value1为空,反序列化失败
要序列化的类含有Class类型属性引起的循环递归无法结束最后内存溢出
要序列化、反序列化的类
public class Request implements Serializable {
private static final long serialVersionUID = -2415428L;
private Class&?&
public Class&?& getClazz() {
public void setClazz(Class&?& clazz) {
this.clazz =
public String getMethod() {
public void setMethod(String method) {
this.method =
public Object getParam() {
public void setParam(Object param) {
this.param =
public Object invoke(Object bean) throws Exception {
return clazz.getMethod(method, param.getClass()).invoke(bean, param);
Request r = new Request()
r.setClazz(Integer.class)
String s = JSON.toJSONString(r, SerializerFeature.WriteClassName)
System.out.println(s)
JSON.parseObject(s)
我们看看内部
public static JSONObject parseObject(String text) {
Object obj = parse(text);
if (obj instanceof JSONObject) {
return (JSONObject)
return (JSONObject) JSON.toJSON(obj);
如果改为JSON.parseObject(s, Request.class);或者直接使用JSON.parse(str)就没问题。
最后的建议:
不要使用JSON.parseObject(…)只使用JSON.parse(str);
没有更多推荐了,解决多表关联转换json内存溢出
使用Hibernate时候对表关联,在把数据转换成Json时,由于两个字段相互包含,输出会引发内存溢出,下面的方法可以帮助你过滤掉其中一个字段,就不会内存溢出了
Gson gson= new GsonBuilder().setExclusionStrategies(new ExclusionStrategy() {
public boolean shouldSkipField(FieldAttributes f) {
//过滤掉字段名包含"products"的字段
return f.getName().contains("orderitems")||f.getName().contains("category");//过滤掉两个
public boolean shouldSkipClass(Class&?& clazz) {
//过滤掉 类名包含 Bean的类
return clazz.getName().contains("Product");
//两个方法,只用重写其中一个就好了
}).create();
result = gson.toJson(list);
jedis.set("category", result);
以下方法也可以解决:
2 在fastjson中还可以使用@JSONField注解来实现属性忽略策略 ;
但是这两种办法,查询出来了多余字段,
3可以优化hql语句来解决
4取消其中一方的关联来解决
没有更多推荐了,在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
fastjson在使用toJSONString()转换含有双引号内容,结果再使用js解析为JSON对象报错Uncaught SyntaxError: Invalid or unexpected token
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
建议把·toJSONString()·的结果·Log.i·出来看看。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
fastjson是java的json,js有自己的json,两个默认实现可能不同,如果js用默认的话,建议js输出默认的json格式,再把fastjson配置成这种格式
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。查看: 2991|回复: 11
WeX5通过Baas服务访问数据库toJson报错
主题帖子积分
中级会员, 积分 454, 距离下一级还需 46 积分
中级会员, 积分 454, 距离下一级还需 46 积分
我按照教程,新建了一个java项目,然后依照外卖简单数据那部分代码,想把窗口上数据存入数据库,运行却报错,错误及目录结构分别如图所示:
我的程序代码在CanCure项目里。请问各位大神,这到底是怎么回事呢?怎么处理呢?
(139.36 KB, 下载次数: 7)
15:38 上传
(20.85 KB, 下载次数: 5)
15:38 上传
(15.35 KB, 下载次数: 5)
15:38 上传
主题帖子积分
这个要看具体的需求,不同的需求调用的时机不一样
你的是注册页面可以直接把data的autoNew设置为true,autoLoad设置为false
远程的联系方法QQ,添加好友时,需在备注里注明其论坛名字及ID,公司等信息
发远程时同时也发一下帖子地址,方便了解要解决的问题&&&&
如按照该方法解决,请及时跟帖,便于版主结贴
主题帖子积分
从5楼发的图看data上应该没有数据,没有数据那么到后端就没有数据就不会循环啊,在运行是给data新增(newData)数据了?
远程的联系方法QQ,添加好友时,需在备注里注明其论坛名字及ID,公司等信息
发远程时同时也发一下帖子地址,方便了解要解决的问题&&&&
如按照该方法解决,请及时跟帖,便于版主结贴
主题帖子积分
中级会员, 积分 454, 距离下一级还需 46 积分
中级会员, 积分 454, 距离下一级还需 46 积分
问题补充:我分别对两个页面的访问地址如下图所示,简单数据运行是正确的。
(25.77 KB, 下载次数: 7)
15:44 上传
(13.7 KB, 下载次数: 5)
15:44 上传
主题帖子积分
var data = this.comp(&data的xid&);
data.toJson(true);看一下
远程的联系方法QQ,添加好友时,需在备注里注明其论坛名字及ID,公司等信息
发远程时同时也发一下帖子地址,方便了解要解决的问题&&&&
如按照该方法解决,请及时跟帖,便于版主结贴
主题帖子积分
正常情况下customSave事件里,event.source就是当前数据集对象,你debugger看看,现在data是什么啊
主题帖子积分
中级会员, 积分 454, 距离下一级还需 46 积分
中级会员, 积分 454, 距离下一级还需 46 积分
var data = this.comp(&data的xid&);
data.toJson(true);看一下
用这种方法虽然不报toJson错误了,但是仍然不能成功,debugger可见到图片01、02所示。
(92.94 KB, 下载次数: 5)
13:28 上传
(117.3 KB, 下载次数: 5)
13:28 上传
主题帖子积分
中级会员, 积分 454, 距离下一级还需 46 积分
中级会员, 积分 454, 距离下一级还需 46 积分
用这种方法虽然不报toJson错误了,但是仍然不能成功,debugger可见到图片01、02所示。 ...
是data组件没有传入数据记录的意思吗?为什么会这样?怎么办呢?
主题帖子积分
中级会员, 积分 454, 距离下一级还需 46 积分
中级会员, 积分 454, 距离下一级还需 46 积分
var data = this.comp(&data的xid&);
data.toJson(true);看一下
断点跟踪到图1中所示位置时,发现sql语句如下:
com.mysql.jdbc.ServerPreparedStatement[76] - INSERT INTO user_info (UserId,MobileNo,UserName,UserPass,UserSource,UserStyle)&&VALUES (null,null,null,null,null,null)
jdbc:mysql://127.0.0.1:3306/cancure, UserName=root@localhost, MySQL-AB JDBC Driver
com.mysql.jdbc.ServerPreparedStatement[76] - INSERT INTO user_info (UserId,MobileNo,UserName,UserPass,UserSource,UserStyle)&&VALUES (null,null,null,null,null,null)
程序中的for循环体没有执行,直接跳到图中所示高亮显示语句了。应该是循环条件(Row row : table.getRows(RowState.NEW))没有成立,这个是怎么设置的呢?
主题帖子积分
中级会员, 积分 454, 距离下一级还需 46 积分
中级会员, 积分 454, 距离下一级还需 46 积分
断点跟踪到图1中所示位置时,发现sql语句如下:
com.mysql.jdbc.ServerPreparedStatement[76] - INSERT I ...
不好意思,刚才忘了发图。
(73.67 KB, 下载次数: 14)
14:54 上传
主题帖子积分
中级会员, 积分 454, 距离下一级还需 46 积分
中级会员, 积分 454, 距离下一级还需 46 积分
从5楼发的图看data上应该没有数据,没有数据那么到后端就没有数据就不会循环啊,在运行是给data新增(newDa ...
太感谢了,果然如你所说,简单数据例子里是那个“新增”按钮里调用new方法了,我这个没有那个按钮,确实疏忽这个问题了,我这是一个注册用户的窗口,现在在model的OnLoad事件里调用data的new方法,终于实现了。我还能不能再请教一下,data的new方法一般都在哪里调用合适呢?谢谢。
Powered by}

我要回帖

更多关于 电脑内存溢出怎么解决 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信