这篇文章其实早在做触动商城的时候已经想写了,不过一直空不出时间和心情来。
有一次用jsonplugin输出json的时候,发生了以下异常:java.sql.SQLException: Positioned Update not supported,其实以前也遇到过这种问题,原因也找到了,是因为我们生成json的类是hibernate的model类,当中有一些对象是延迟加载的,这些对象并不是原model类中的属性,而是由cglib这个字节码生成器动态生成的对象。Hibernate在这个子类中添加了hibernateLazyInitializer等等的附加属性。由于jsonplugin并不区分类和动态生成的类,所以也会试图序列化hibernateLazyInitializer属性,从而导致出现上述的异常。
以前项目时间紧急,采用了治标不治本的紧急应对方法:将那些延迟加载的对象都用一个默认构造方法的对象来代替,但这样不利用复用。
在网上以Positioned Update not supported为关键字搜索了一下,发现了一篇很有用的文章,文本也提到这个问题,并给出了解决方法。不过我却发现文本提到的jsonplugin和我们项目中使用的jsonplugin有些地方不太相同,但它的思路都是一样的。沿用这个思路应该就可以解决问题了。
思路如下:
1、判断这个对象是否由cglib生成的。代码如下:
boolean isCreateByCGLIB = clazz.getName().indexOf("$$EnhancerByCGLIB$$") > -1 ? true : false;
如果此对象确实是由cglib生成的,那么我们取此对象的基类,这一步很关键,因为通过取得此对象的基类,我们就忽略了所有由cglib生成的跟hibernate相关的属性。
2、通过反射,取得此对象的所有继续于基类的属性。
3、通过反射,取得此对象的所有get方法器(这一步不能省,不然出来的属性就少了)。
4、输出json。
问题解决,开源的力量就是伟大。
分享到:
相关推荐
JsonWriter
修改后的JSONWriter类,相信请见
标题 "JsonWriter_C++_" 暗示我们讨论的是一个C++实现的JSON写入工具,可能是用于序列化数据到JSON格式的库。在描述中提到的“使用libcurl动态库上传文件和字符串”,表明这个项目可能包含了网络通信功能,通过...
jsonwriter :功能模块,用于 该模块为使用应用程序编写 JSON 提供了一个简单的框架。 它包含许多用于正确生成适当转义的 JSON 的辅助方法。 此模块的 API 尚不稳定。 示例用户是通过使用模块。 兼容性 标签与 ...
标题中的"JsonWriter.rar"指的是一个包含JsonWriter相关代码的压缩包,主要针对Windows平台的编程,使用Java语言实现。描述中提到的“write Messages Array Source Code for Android”表明这个JsonWriter是为Android...
3. **错误处理**:在处理无效的JSON数据或在序列化过程中遇到问题时,提供错误报告。 4. **性能优化**:由于描述中提到解析速度快,这个实现可能包含了一些优化技术,如减少内存分配、缓存重复字符串等。 为了使用...
为了解决这个问题,我们可以对 LitJson 进行扩展,使其支持不转义汉字的 JSON 序列化。 首先,让我们理解一下 JSON 对中文字符的转义。在 JSON 格式中,非 ASCII 字符(如汉字)通常会被转换为 Unicode 转义序列,...
通过2-jsonwriter 将 JSON 字符串化的简单转换流 安装 npm install through2-jsonwriter 或者 npm install --save through2-jsonwriter 用法 var jsonWriter = require ( 'through2-jsonwriter' ) ; var ...
Solidity JSON 编写器 一个帮助生成和构建用于智能合约开发的 JSON 的库。... using JsonWriter for JsonWriter.Json; function generateJSON () external pure returns ( string memory ) { JsonWri
public class JsonWriter { public static void main(String[] args) { JSONObject jsonObject = new JSONObject(); jsonObject.put("key1", "value1"); jsonObject.put("key2", "value2"); try (FileWriter ...
这个压缩包包含的是LitJson的官方源码,经过反编译后,方便开发者进行深度定制或解决特定问题。 在源码中,我们可以看到主要的类`JsonMapper`,它是整个库的核心,负责将JSON字符串转换为.NET对象,反之亦然。`Json...
本项目“基于C#实现的对Json进行格式化字符串解析的.NET类库源码V3.0”提供了一个自定义的解决方案,以帮助开发者更方便地处理JSON数据。 C#中处理JSON的标准库是Newtonsoft.Json(也称为Json.NET),它是一个功能...
JsonWriter jsonWriter = new JsonWriter(quickWriter, JsonWriter.DETACHED_ROOT_MODE); jsonWriter.startObject(); jsonWriter.setValue((String) source); jsonWriter.endObject(); } @Override public ...
在处理JSON字符串时,通常会遇到字符转义的问题。例如,双引号(")在JSON字符串中必须使用反斜杠(\)进行转义,变成\"。然而,“不转义”在这里可能意味着LitJson在某些特定情况下不会对所有特殊字符进行标准的...
从文件或流中读取和写入JSON数据。 通过JsonSchema进行验证(有关规范,请参见http://json-schema.org)
DataX是阿里巴巴开源的一款高效、稳定、扩展性强的数据同步工具,用于在各种...无论是传统的数据库、现代的大数据平台,还是云服务和消息队列,都有对应的解决方案,为企业和开发者提供了强大的数据迁移和整合能力。
在Android开发中,Gson库是一个非常重要的工具,它由Google提供,用于在Java对象和JSON数据之间进行映射。本资源"android-Gson方法大合集demo"显然...对于学习和调试Gson相关问题,这个资源无疑是一份宝贵的参考资料。
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT...
它包含了几个关键的类,如JsonMapper、JsonReader和JsonWriter,这些类提供了从JSON字符串到C#对象以及从C#对象到JSON字符串的转换功能。 1. **JsonMapper**: 这是LitJson库的核心,提供了一种简单的方式来映射JSON...
JSONWriter jsonWriter = new JSONWriter(writer); jsonWriter.object(); // 写入键值对... jsonWriter.endObject(); String jsonString = writer.toString(); ``` 4. **过滤器与转换器** 可以使用过滤器和...