`
jlj008
  • 浏览: 95402 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于sojo输出json中出现~unique-id~字样的问题

阅读更多
问题:在项目中,问题的表现如下,使用SojoJsonStringWriter,当需要序列化一个对象成json格式时
class Result {
  List<Broadcast> broadcasts;
  ...
}
class Broadcast {
  List<Presenter> presenters;
  ...
}

如果result中的多个broadcast共用了同一个presenter,输出结果中,第一个broadcast中的presenter正常,而第2、3个presenter显示为~unique-id~1。
原因:
Spring集成jsonview的时候,其中有以下两种方式较为常用,
SojoJsonStringWriter:必须要有set/get方法,对boolean;is不会序列化,只能用get替代;对共用对象的多次解析会出现~unique-id~(可能是因为Hibernate持久中的延迟加载的缘故)
JsonlibJsonStringWriter:功能上没有前者强,如类型需要自己转化,但可以通过定制JsonConfig来实现;不会出现对共用对象的多次解析会出现~unique-id~
解决方案:
使用JsonlibJsonStringWriter,在views.xml中新增
<bean name="jsonlibView" class="org.springframework.web.servlet.view.json.JsonView">
  <property name="encoding" value="UTF-8" />
  <property name="contentType" value="application/json" />
  <property name="jsonWriter" ref="jsonlibJsonStringWriter" />
  <property name="jsonErrors">
    <list>
      <ref bean="statusError" />
      <ref bean="modelflagError" />
    </list>
  </property>
</bean>
<bean name="jsonlibJsonStringWriter" class="org.springframework.web.servlet.view.json.writer.jsonlib.JsonlibJsonStringWriter">
  <property name="convertAllMapValues" value="true" />
  <property name="enableJsonConfigSupport" value="true" />
</bean>


此时,直接使用,可能会出现异常:net.sf.json.JSONException: java.lang.NoSuchMethodException: Property 'delegate' has no getter method
这是因为实体对象用的是Hibernate的延迟加载,可以通过以下方式解决:
public class HibernateJsonBeanProcessor implements JsonBeanProcessor {
  public JSONObject processBean(Object obj, JsonConfig jsonConfig) {
    return new JSONObject();
  }
}
public class HibernateJsonBeanProcessorMatcher extends JsonBeanProcessorMatcher {
  private final Log logger = LogFactory.getLog(HibernateJsonBeanProcessorMatcher.class);
  @SuppressWarnings("unchecked")
  @Override
  public Object getMatch(Class target, Set set) {
    if (target.getName().contains("$$EnhancerByCGLIB$$")) {
      logger.warn("Found Lazy-References in Hibernate object " + target.getName());
      return org.hibernate.proxy.HibernateProxy.class;
    }
    return DEFAULT.getMatch(target, set);
  }
}
public class HibernateJsonlibJsonWriterConfiguratorTemplate extends JsonlibJsonWriterConfiguratorTemplate {
  @Override
  public JsonConfig getJsonConfig() {
    JsonConfig jsonConfig = new JsonConfig();
    jsonConfig.registerJsonBeanProcessor(HibernateProxy.class, new HibernateJsonBeanProcessor());
    jsonConfig.setJsonBeanProcessorMatcher(new HibernateJsonBeanProcessorMatcher());
    return jsonConfig;
  }
}

在controller的方法返回mav之前,执行以下代码进行注册config
JsonWriterConfiguratorTemplateRegistry registry = JsonWriterConfiguratorTemplateRegistry.load(request);
registry.registerConfiguratorTemplate(new HibernateJsonlibJsonWriterConfiguratorTemplate());


此时调试,可能会出现另一个异常:net.sf.json.JSONException: There is a cycle in the hierarchy
这可能是Bean对象里有循环调用的属性,解决办法是,增加循环应对的策略,
config.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
或者设置过滤字段,将有可能循环的属性过滤掉,config.setExcludes(new String[])
这里还可以增加别的功能,如
config.setIgnoreDefaultExcludes(false);
config.registerJsonValueProcessor(Date.class, new DateJsonValueProcessor("MM/dd/yyyy"));
...

至此,问题解决。
参考:
http://spring-json.sourceforge.net/binding.html
http://www.cnblogs.com/yueue/archive/2010/02/23/1672059.html
http://pipe.iteye.com/blog/224564
分享到:
评论

相关推荐

    sojo-optional-0.5.0

    Download sojo-optional-0.5.0.jar META-INF/MANIFEST.MF net.sf.sojo.common.CompareResult.class net.sf.sojo.common.GenericComparator.class net.sf.sojo.common.IterateableUtil.class ...

    hcatalog-0.5.0

    hcatalog is a metadata and table management system for hadoop, it's very useful

    projeto_zero:网站sojo o jogo Horizo​​n Zero Dawn

    projeto_zero 网站sojo o jogo Horizo​​n Zero Dawn

    Java 员工管理系统项目源代码(可做毕设项目参考)

    Java 员工管理系统项目是一个基于 Java 编程语言开发的桌面应用程序,旨在管理员工的信息、津贴、扣除和薪资等功能。该系统通过提供结构和工具集,使公司能够有效地管理其员工数据和薪资流程。 系统特点 员工管理:管理员可以添加、查看和更新员工信息。 津贴管理:管理员可以添加和管理员工的津贴信息。 扣除管理:管理员可以添加和管理员工的扣除信息。 搜索功能:可以通过员工 ID 搜索员工详细信息。 更新薪资:管理员可以更新员工的薪资信息。 支付管理:处理员工的支付和生成支付记录。 模块介绍 员工管理模块:管理员可以添加、查看和更新员工信息,包括员工 ID、名字、姓氏、年龄、职位和薪资等。 津贴管理模块:管理员可以添加和管理员工的津贴信息,如医疗津贴、奖金和其他津贴。 扣除管理模块:管理员可以添加和管理员工的扣除信息,如税收和其他扣除。 搜索功能模块:可以通过员工 ID 搜索员工详细信息。 更新薪资模块:管理员可以更新员工的薪资信息。 支付管理模块:处理员工的支付和生成支付记录 可以作为毕业设计项目参考

    CAD实验报告:制药车间动力控制系统图、烘烤车间电气控制图、JSJ型晶体管式时间继电器原理图、液位控制器电路图

    CAD实验报告:制药车间动力控制系统图、烘烤车间电气控制图、JSJ型晶体管式时间继电器原理图、液位控制器电路图

    使用 Arduino 和 Python 实时数据绘图的温度监控系统源码(可做毕设项目参考)

    项目简介: 本项目将教您如何使用 Arduino 和 Python 实时数据绘图来构建温度监控系统。通过这个项目,您将学习如何从 Arduino 到 Python 进行串行通信,并实时收集和监控温度数据。 项目目标: 实时监控和绘制温度数据。 提供用户友好的操作界面。 提高用户的编程技能,特别是Arduino和Python的应用能力。 项目功能 实时温度监控: 传感器每秒读取一次温度数据,并通过串行监视器发送到Python程序。 数据保存: Python程序将温度数据保存到CSV文件中。 实时数据绘图: 使用Matplotlib库实时绘制温度数据,温度在Y轴,时间在X轴。 项目优势 高效的数据监控: 实时监控和绘制温度数据,提高数据监控的效率。 用户友好: 界面简洁,操作简单,用户可以轻松使用该应用程序。 提高编程技能: 通过实践项目,提高对Arduino和Python的应用能力。 项目技术细节 项目详情: 项目名:使用 Arduino 和 Python 实时数据绘图的温度监控系统 项目平台:Arduino 和 Python 使用的编程语言:C++(Arduino)、Python ID

    软件测试-软件测试方案pdf

    本测试计划提供给深圳移动公司PMS核心小组成员,对PMS EXPRESS 系统进行功能测试。测试计划主要通过对基站项目管理过程的模拟,从项目的立项开始直至基站的验收交付以及知识沉淀,对基站建设全过程中涉及的管理内容进行模拟测 试。测试计划中设计了两个基站项目一明宁花园、椰风海岸。其中明宁花园按 原计划如期完工,而椰风海岸因为设备没能如期到货导致了个整个项目工期的延误。

    博物馆智能化系统的解决方案.pptx

    博物馆智能化系统的解决方案.pptx

    基于STM32的电子罗盘

    基于STM32的电子罗盘试验

    【matlab GUI仿真】说明:GUI界面设计,四旋翼飞机仿真 VR界面设计

    【matlab GUI仿真】说明:GUI界面设计,四旋翼飞机仿真。VR界面设计。 (GUI interface design, four rotor aircraft simulation. The VR interface design. ) 【matlab GUI仿真】说明:GUI界面设计,四旋翼飞机仿真。VR界面设计。

    基于VHDL的倒车雷达项目(免费提供全部源码)

    项目简介: 本项目实现了一个基于VHDL(VHSIC硬件描述语言)的倒车雷达系统。倒车雷达用于检测车辆后方障碍物的距离,以辅助驾驶员安全倒车。系统通过超声波传感器检测距离,并使用LED显示或蜂鸣器提示障碍物的接近程度。 项目模块: 传感器接口模块: 处理超声波传感器的信号。 发送触发信号,接收回波信号。 计算回波时间,进而计算距离。 距离计算模块: 根据传感器回波时间计算距离。 处理和转换距离数据,准备用于显示和警报。 警报显示模块: 基于计算出的距离提供视觉和听觉警报。 使用LED显示不同的距离范围。 使用蜂鸣器发出不同频率的警报声。 控制模块: 控制各模块的协调工作。 管理超声波传感器的触发和数据采集周期。

    2024年动力电池回收行业市场分析报告.pptx

    行业报告

    ssm框架在线课堂微信小程序源码+项目说明(高分毕设)

    毕业设计ssm框架在线课堂微信小程序源码+项目说明(高分毕设).zip 个人经导师指导并认可通过的高分设计项目,评审分98分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 毕业设计ssm框架在线课堂微信小程序源码+项目说明(高分毕设).zip 个人经导师指导并认可通过的高分设计项目,评审分98分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 毕业设计ssm框架在线课堂微信小程序源码+项目说明(高分毕设).zip 个人经导师指导并认可通过的高分设计项目,评审分98分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 项目主要功能: 该项目是一款针对在线课堂微信小程序的数据管理系统,旨在便捷用户对小程序中的信息进行有效管理。系统设计注重功能完善和用户体验,力求使用户能轻松找到所需信息。采用JAVA技术开发,并结合现有成熟源代码模板,确保了平台的可操作性和实用性。关键词:在线课堂微信小程序;JAVA。

    国内锂矿加速开发,四川锂矿详细梳理

    国内锂矿加速开发,四川锂矿详细梳理

    一个基于react框架的资源文件

    一个基于react框架的资源文件 练习,xiaoyoushop分支是小优后台,screen分支是大屏项目,react分支是基于react框架,使用ts语言,vite构建的一个后台管理系统项目 练习,xiaoyoushop分支是小优后台,screen分支是大屏项目,react分支是基于react框架,使用ts语言,vite构建的一个后台管理系统项目 练习,xiaoyoushop分支是小优后台,screen分支是大屏项目,react分支是基于react框架,使用ts语言,vite构建的一个后台管理系统项目 内容来源于网络分享。仅供学习使用。请勿商用。如有侵权,请联系我。我将立即删除

    MQD企业大学建设思路与年度工作重点.pptx

    MQD企业大学建设思路与年度工作重点.pptx

    Java语言基础入门教程 Java实训教程 13.反射 共38页.pptx

    Java语言基础入门教程 Java实训教程 13.反射 共38页.pptx

    网上购物商城数据库设计报告.docx

    网上购物商城数据库设计报告.docx

    单机成本核算统计表.docx

    单机成本核算统计表.docx

    Swift语言简介.md

    Swift 是由苹果公司推出的一种现代化的编程语言,用于开发 iOS、macOS、watchOS 和 tvOS 应用程序。它结合了安全、高性能和易用性的特点,成为开发苹果平台应用程序的首选语言。

Global site tag (gtag.js) - Google Analytics