文章来源:http://code.alibabatech.com/wiki/display/FastJSON/Inside+Fastjson
Fastjson内幕
JSON协议使用方便,越来越流行。JSON的处理器有很多,为什么需要再写一个呢?因为我们需要一个性能很好的JSON Parser,希望JSON Parser的性能有二进制协议一样好,比如和protobuf一样,这可不容易,但确实做到了。有人认为这从原理上就是不可能的,但是计算机乃实践科学,看实际的结果比原理推导更重要。
这篇文章告诉大家:
Fastjson究竟有多快
为什么Fastjson这么快
你能用Fastjson来做什么!
如何获得fastjson?
首先,Fastjson究竟有多快?
我们看一下使用https://github.com/eishay/jvm-serializers/提供的程序进行测试得到的结果:
序列化时间 反序列化时间 大小 压缩后大小
java序列化 8654 43787 889 541
hessian 6725 10460 501 313
protobuf 2964 1745 239 149
thrift 3177 1949 349 197
avro 3520 1948 221 133
json-lib 45788 149741 485 263
jackson 3052 4161 503 271
fastjson 2595 1472 468 251
测试数据:https://github.com/eishay/jvm-serializers/wiki/TestValue
这是一个468bytes的JSON Bytes测试,从测试结果来看,无论序列化和反序列化,Fastjson超越了protobuf,可以当之无愧fast! 它比java deserialize快超过30多倍,比json-lib快100倍。由于Fastjson的存在,你可以放心使用json统一协议,达到文本协议的可维护性,二进制协议的性能。
为什么Fastjson能够做到这么快?
JSON处理主要包括两个部分,serialize和deserialize。serialize就是把Java对象变成JSON String或者JSON Bytes。Deserialize是把JSON String或者Json Bytes变成java对象。其实这个过程有些JSON库是分三部分的,json string <-> json tree <-> java object。Fastjson也支持这种转换方式,但是这种转换方式因为有多余的步骤,性能不好,不推荐使用。
一、Fastjson中Serialzie的优化实现
1、自行编写类似StringBuilder的工具类SerializeWriter。
把java对象序列化成json文本,是不可能使用字符串直接拼接的,因为这样性能很差。比字符串拼接更好的办法是使用java.lang.StringBuilder。StringBuilder虽然速度很好了,但还能够进一步提升性能的,fastjson中提供了一个类似StringBuilder的类com.alibaba.fastjson.serializer.SerializeWriter。
SerializeWriter提供一些针对性的方法减少数组越界检查。例如public void writeIntAndChar(int i, char c) {},这样的方法一次性把两个值写到buf中去,能够减少一次越界检查。目前SerializeWriter还有一些关键的方法能够减少越界检查的,我还没实现。也就是说,如果实现了,能够进一步提升serialize的性能。
2、使用ThreadLocal来缓存buf。
这个办法能够减少对象分配和gc,从而提升性能。SerializeWriter中包含了一个char[] buf,每序列化一次,都要做一次分配,使用ThreadLocal优化,能够提升性能。
3、使用asm避免反射
获取java bean的属性值,需要调用反射,fastjson引入了asm的来避免反射导致的开销。fastjson内置的asm是基于objectweb asm 3.3.1改造的,只保留必要的部分,fastjson asm部分不到1000行代码,引入了asm的同时不导致大小变大太多。
4、使用一个特殊的IdentityHashMap优化性能。
fastjson对每种类型使用一种serializer,于是就存在class -> JavaBeanSerizlier的映射。fastjson使用IdentityHashMap而不是HashMap,避免equals操作。我们知道HashMap的算法的transfer操作,并发时可能导致死循环,但是ConcurrentHashMap比HashMap系列会慢,因为其使用volatile和lock。fastjson自己实现了一个特别的IdentityHashMap,去掉transfer操作的IdentityHashMap,能够在并发时工作,但是不会导致死循环。
5、缺省启用sort field输出
json的object是一种key/value结构,正常的hashmap是无序的,fastjson缺省是排序输出的,这是为deserialize优化做准备。
6、集成jdk实现的一些优化算法
在优化fastjson的过程中,参考了jdk内部实现的算法,比如int to char[]算法等等。
二、fastjson的deserializer的主要优化算法
deserializer也称为parser或者decoder,fastjson在这方面投入的优化精力最多。
1、读取token基于预测。
所有的parser基本上都需要做词法处理,json也不例外。fastjson词法处理的时候,使用了基于预测的优化算法。比如key之后,最大的可能是冒号":",value之后,可能是有两个,逗号","或者右括号"}"。在com.alibaba.fastjson.parser.JSONScanner中提供了这样的方法:
public void nextToken(int expect) {
for (;;) {
switch (expect) {
case JSONToken.COMMA: //
if (ch == ',') {
token = JSONToken.COMMA;
ch = buf[++bp];
return;
}
if (ch == '}') {
token = JSONToken.RBRACE;
ch = buf[++bp];
return;
}
if (ch == ']') {
token = JSONToken.RBRACKET;
ch = buf[++bp];
return;
}
if (ch == EOI) {
token = JSONToken.EOF;
return;
}
break;
// ... ...
}
}
从上面摘抄下来的代码看,基于预测能够做更少的处理就能够读取到token。
2、sort field fast match算法
fastjson的serialize是按照key的顺序进行的,于是fastjson做deserializer时候,采用一种优化算法,就是假设key/value的内容是有序的,读取的时候只需要做key的匹配,而不需要把key从输入中读取出来。通过这个优化,使得fastjson在处理json文本的时候,少读取超过50%的token,这个是一个十分关键的优化算法。基于这个算法,使用asm实现,性能提升十分明显,超过300%的性能提升。
{ "id" : 123, "name" : "魏加流", "salary" : 56789.79}
------ -------- ----------
在上面例子看,虚线标注的三个部分是key,如果key_id、key_name、key_salary这三个key是顺序的,就可以做优化处理,这三个key不需要被读取出来,只需要比较就可以了。
这种算法分两种模式,一种是快速模式,一种是常规模式。快速模式是假定key是顺序的,能快速处理,如果发现不能够快速处理,则退回常规模式。保证性能的同时,不会影响功能。
在这个例子中,常规模式需要处理13个token,快速模式只需要处理6个token。
实现sort field fast match算法的代码在这个类com.alibaba.fastjson.parser.deserializer.ASMDeserializerFactory,是使用asm针对每种类型的VO动态创建一个类实现的。
这里是有一个用于演示sort field fast match算法的代码: http://code.alibabatech.com/svn/fastjson/trunk/fastjson/src/test/java/data/media/ImageDeserializer.java
// 用于快速匹配的每个字段的前缀
char[] size_ = "\"size\":".toCharArray();
char[] uri_ = "\"uri\":".toCharArray();
char[] titile_ = "\"title\":".toCharArray();
char[] width_ = "\"width\":".toCharArray();
char[] height_ = "\"height\":".toCharArray();
// 保存parse开始时的lexer状态信息
int mark = lexer.getBufferPosition();
char mark_ch = lexer.getCurrent();
int mark_token = lexer.token();
int height = lexer.scanFieldInt(height_);
if (lexer.matchStat == JSONScanner.NOT_MATCH) {
// 退出快速模式, 进入常规模式
lexer.reset(mark, mark_ch, mark_token);
return (T) super.deserialze(parser, clazz);
}
String value = lexer.scanFieldString(size_);
if (lexer.matchStat == JSONScanner.NOT_MATCH) {
// 退出快速模式, 进入常规模式
lexer.reset(mark, mark_ch, mark_token);
return (T) super.deserialze(parser, clazz);
}
Size size = Size.valueOf(value);
// ... ...
// batch set
Image image = new Image();
image.setSize(size);
image.setUri(uri);
image.setTitle(title);
image.setWidth(width);
image.setHeight(height);
return (T) image;
3、使用asm避免反射
deserialize的时候,会使用asm来构造对象,并且做batch set,也就是说合并连续调用多个setter方法,而不是分散调用,这个能够提升性能。
4、对utf-8的json bytes,针对性使用优化的版本来转换编码。
这个类是com.alibaba.fastjson.util.UTF8Decoder,来源于JDK中的UTF8Decoder,但是它使用ThreadLocal Cache Buffer,避免转换时分配char[]的开销。
ThreadLocal Cache的实现是这个类com.alibaba.fastjson.util.ThreadLocalCache。第一次1k,如果不够,会增长,最多增长到128k。
//代码摘抄自com.alibaba.fastjson.JSON
public static final <T> T parseObject(byte[] input, int off, int len, CharsetDecoder charsetDecoder, Type clazz,
Feature... features) {
charsetDecoder.reset();
int scaleLength = (int) (len * (double) charsetDecoder.maxCharsPerByte());
char[] chars = ThreadLocalCache.getChars(scaleLength); // 使用ThreadLocalCache,避免频繁分配内存
ByteBuffer byteBuf = ByteBuffer.wrap(input, off, len);
CharBuffer charByte = CharBuffer.wrap(chars);
IOUtils.decode(charsetDecoder, byteBuf, charByte);
int position = charByte.position();
return (T) parseObject(chars, position, clazz, features);
}
5、symbolTable算法。
我们看xml或者javac的parser实现,经常会看到有一个这样的东西symbol table,它就是把一些经常使用的关键字缓存起来,在遍历char[]的时候,同时把hash计算好,通过这个hash值在hashtable中来获取缓存好的symbol,避免创建新的字符串对象。这种优化在fastjson里面用在key的读取,以及enum value的读取。这是也是parse性能优化的关键算法之一。
以下是摘抄自JSONScanner类中的代码,这段代码用于读取类型为enum的value。
int hash = 0;
for (;;) {
ch = buf[index++];
if (ch == '\"') {
bp = index;
this.ch = ch = buf[bp];
strVal = symbolTable.addSymbol(buf, start, index - start - 1, hash); // 通过symbolTable来获得缓存好的symbol,包括fieldName、enumValue
break;
}
hash = 31 * hash + ch; // 在token scan的过程中计算好hash
// ... ...
}
我们能用fastjson来作什么?
1、替换其他所有的json库,java世界里没有其他的json库能够和fastjson可相比了。
2、使用fastjson的序列化和反序列化替换java serialize,java serialize不单性能慢,而且体制大。
3、使用fastjson替换hessian,json协议和hessian协议大小差不多一样,而且fastjson性能优越,10倍于hessian
4、把fastjson用于memached缓存对象数据。
如何获得fastjson
官方网站
Fastjson是开源的,基于Apache 2.0协议。你可以在官方网站了解最新信息。 http://code.alibabatech.com/wiki/display/FastJSON/Home
maven用户
Maven仓库 http://code.alibabatech.com/mvn/releases/
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.2</version>
</dependency>
Downlaods
Binary : http://code.alibabatech.com/mvn/releases/com/alibaba/fastjson/1.1.2/fastjson-1.1.2.jar
Source :http://code.alibabatech.com/mvn/releases/com/alibaba/fastjson/1.1.2/fastjson-1.1.2-sources.jar
Subversion : http://code.alibabatech.com/svn/fastjson/trunk/fastjson/
Labels:
None
28 Comments comments.show.hide
Aug 15, 2011
Anonymous
有个很奇怪的问题,无论是用json-lib还是jackson,还是你的Fastjson,都无法解析Map中key object,比如Map<CustomerObject1,CustomerObject2>,奇怪的地方在于作为value的CustomerObject2可以直接转换为json字符串,但作为key的CustomerObject1只是一个很普通的java bean,却无法转换,每次都显示的是hashcode,这是什么原因呢?按理来说做到应该不复杂啊,而且CustomerObject1还是重写了hashcode和equals方法的,求解啊
Permalink
Reply
Aug 18, 2011
温 少
这局限于json的标准,考虑实现这个功能。
Permalink
Reply
Dec 10, 2011
Anonymous
Map的key本来就是由对象hash过来的,难道你能再根据hashcode反算出对象?
不靠谱
Permalink
Reply
Sep 16, 2011
Anonymous
class A<T>
Unknown macro: { Map<String,T> attribute = new HashMap<String,T>(); }
A<MyClass> a = new A<MyClass>();
String json = JSON.toJSONString(a);
JSON.parseObject(json, new TypeReference<MyClass>() {});
这样为什么MyClass转不回来额?是写的不对还是本来不支持?
Permalink
Reply
Sep 16, 2011
Anonymous
温少有没有测试国JSEL.
JSEL 中也有一个性能不错的JSON工具:
http://code.google.com/p/lite/wiki/JSON
Permalink
Reply
Mar 12, 2012
Anonymous
Woah nelly, how about them aplpes!
Permalink
Reply
Sep 21, 2011
Anonymous
fastjson跟Gson的性能做过对比吗?另外,fastjson可以在Android手机平台上吗?Android平台上也是用java编程语言的
Permalink
Reply
Sep 22, 2011
Anonymous
fastjson有没有对webservice的支持,比如cxf的jsonProvider
Permalink
Reply
Mar 12, 2012
Anonymous
I've been loiokng for a post like this forever (and a day)
Permalink
Reply
Mar 13, 2012
Anonymous
tFUMWN <a href="http://hjpoqziqdyuf.com/">hjpoqziqdyuf</a>
Permalink
Reply
Mar 13, 2012
Anonymous
16UTi1 , yhegfvcflzgp, [link=http://crwwcybyxeeh.com/]crwwcybyxeeh[/link], http://xpivegnnlqbk.com/
Permalink
Reply
Mar 13, 2012
Anonymous
Z6f9y0 <a href="http://wzdyvzlwfkpn.com/">wzdyvzlwfkpn</a>
Permalink
Reply
Mar 16, 2012
Anonymous
Em1NEX , jzlidchlqxfu, [link=http://jwjxiuchxikc.com/]jwjxiuchxikc[/link], http://gushgcoigxrd.com/
Permalink
Reply
Oct 13, 2011
Anonymous
发现一给我问题,使用fastjson在做测试时,如果实体对象的属性是以大写字母开头(特殊情况)的下,如果使用fastjson将对象集合转换成json字符串的时候,fastjson会自动把以大写字母开头的的对象的属性的头一个字母自动更改成小写的,这样如果在前台页面还是按照实体对象中定义的属性使用javascript迭代取值时,就会出项undefined的错误。不过,把通过fastjson转化后的json字符串再转换成java的实体对象后再取值却没有影响,可以正常取到。
如:
User.java
——————————————————————————————————————————————————————————
……
private String id;
private String name;
private int age;
private boolean marriage;
private String SOMETHING;//此处定义的属性全部都是大写字母
……
——————————————————————————————————————————————————————————
JsonTest.java
——————————————————————————————————————————————————————————
……
User u=new User();
u.setAge(111);
u.setId("100");
u.setMarriage(Boolean.FALSE);
u.setName("hety");
u.setSOMETHING("中华人民共和国");
User u2=new User();
u2.setAge(222);
u2.setId("101");
u2.setMarriage(Boolean.TRUE);
u2.setName("张三");
u2.setSOMETHING("测试测试测试");
List<User> list=new ArrayList<User>();
list.add(u);
list.add(u2);
String json=JSON.toJSONString(list);
System.out.println(json);
……
最后一行打印如下:
Unknown macro: {"age"}
fastjson并没有严格按照实体对象中定义的属性来输出“SOMETHING”,而是输出了“sOMETHING”,这个算不算一个bug呢?
email: xx23344@qq.com
Permalink
Reply
Oct 13, 2011
Anonymous
发现一个问题,使用fastjson在做测试时,如果实体对象的属性是以大写字母开头(特殊情况)的下,如果使用fastjson将对象集合转换成json字符串的时候,fastjson会自动把以大写字母开头的的对象的属性的头一个字母自动更改成小写的,这样如果在前台页面还是按照实体对象中定义的属性使用javascript迭代取值时,就会出项undefined的错误。不过,把通过fastjson转化后的json字符串再转换成java的实体对象后再取值却没有影响,可以正常取到。
如:
User.java
——————————————————————————————————————————————————————————
……
private String id;
private String name;
private int age;
private boolean marriage;
private String SOMETHING;//此处定义的属性全部都是大写字母
……
——————————————————————————————————————————————————————————
JsonTest.java
——————————————————————————————————————————————————————————
……
User u=new User();
u.setAge(111);
u.setId("100");
u.setMarriage(Boolean.FALSE);
u.setName("hety");
u.setSOMETHING("中华人民共和国");
User u2=new User();
u2.setAge(222);
u2.setId("101");
u2.setMarriage(Boolean.TRUE);
u2.setName("张三");
u2.setSOMETHING("测试测试测试");
List<User> list=new ArrayList<User>();
list.add(u);
list.add(u2);
String json=JSON.toJSONString(list);
System.out.println(json);
……
最后一行打印如下:
Unknown macro:
Unknown macro: {"age"}
fastjson并没有严格按照实体对象中定义的属性来输出“SOMETHING”,而是输出了“sOMETHING”,这个算不算一个bug呢?
email: xx23344@qq.com
Permalink
Reply
Oct 13, 2011
Anonymous
发现一给我问题,使用fastjson在做测试时,如果实体对象的属性是以大写字母开头(特殊情况)的下,如果使用fastjson将对象集合转换成json字符串的时候,fastjson会自动把以大写字母开头的的对象的属性的头一个字母自动更改成小写的,这样如果在前台页面还是按照实体对象中定义的属性使用javascript迭代取值时,就会出项undefined的错误。不过,把通过fastjson转化后的json字符串再转换成java的实体对象后再取值却没有影响,可以正常取到。
如:
User.java
——————————————————————————————————————————————————————————
……
private String id;
private String name;
private int age;
private boolean marriage;
private String SOMETHING;//此处定义的属性全部都是大写字母
……
——————————————————————————————————————————————————————————
JsonTest.java
——————————————————————————————————————————————————————————
……
User u=new User();
u.setAge(111);
u.setId("100");
u.setMarriage(Boolean.FALSE);
u.setName("hety");
u.setSOMETHING("中华人民共和国");
User u2=new User();
u2.setAge(222);
u2.setId("101");
u2.setMarriage(Boolean.TRUE);
u2.setName("张三");
u2.setSOMETHING("测试测试测试");
List<User> list=new ArrayList<User>();
list.add(u);
list.add(u2);
String json=JSON.toJSONString(list);
System.out.println(json);
……
最后一行打印如下(以下都是用中文的符号,要不正常显示不了):
{“age":222,"id":"101","marriage":true,"name":"张三","sOMETHING":"测试测试测试"}
fastjson并没有严格按照实体对象中定义的属性来输出“SOMETHING”,而是输出了“sOMETHING”,这个算不算一个bug呢?
email: xx23344@qq.com
Permalink
Reply
Nov 02, 2011
Anonymous
我测试fastjson反序列化效率最高,但是序列化运行效率却远低于jackson和gson,详细看 http://www.iteye.com/topic/1113183?page=7#2269699
Permalink
Reply
Feb 29, 2012
Anonymous
FastJson是不是不能像jsonLib一样能对JSON字符串中元素的key进行拼写检查。
比如下面这段代码
try
Unknown macro: { businessId=jsonObject.getLong("bid"); }
catch(Exception e)
{
}
在JSONLib中如果bid没有拼写正确,则会抛出异常
但在FastJson好像不会。
Permalink
Reply
Mar 12, 2012
Anonymous
What's it take to become a sublime expounder of prose like yroeuslf?
Permalink
Reply
Mar 13, 2012
Anonymous
psRYhN , trxacbekjfts, [link=http://cvcnkpwnwioa.com/]cvcnkpwnwioa[/link], http://elipeltozheq.com/
Permalink
Reply
Mar 13, 2012
Anonymous
lHmDxJ <a href="http://vfmmnevwhmzi.com/">vfmmnevwhmzi</a>
Permalink
Reply
Mar 16, 2012
Anonymous
NDmOiP , jdpsennnfjiw, [link=http://hveiofuofoty.com/]hveiofuofoty[/link], http://rkgfhsbmewjs.com/
Permalink
Reply
Mar 26, 2012
Anonymous
定义了一个 List<T> list;
...
JSON.toJSONString(list)
出现 .......},{"customer":{"$ref":"$[1].customer" 问题
二条数据,不能有相同的实体类?
Permalink
Reply
Apr 27, 2012
Anonymous
想要一个注解比如名字叫@JSONDisField,使用了此注解,则在javabean转换为json的时候丢弃此字段
Permalink
Reply
Jun 02, 2012
Anonymous
我使用eclipse for javaee,tomcat7.0+,JDK 1.6+
为什么在javase中正常,但在javaee中,比如servlet或者jsp中,不能执行,出现JSON cannot be resolved错误,重新导入好多次了。
.....
String jsonTest="test json";
String str=JSON.toJSONString(jsonTest);//这句出现java.lang.ClassNotFoundException异常。
.....
好几个版本都是这样,使用google的Gson也是这样。
Permalink
Reply
Jul 24, 2012
Anonymous
搜索了源码,没有找到 如何转换java object 到 json tree的api,wiki中提到可以支持:
json string <-> json tree <-> java object
json tree虽然会减慢速度,但在如下场景还是有需要的:
[{parent-name:'fast',boys-num:2,girls-num:1},
{parent-name:'json',boys-num:1,girls-num:2}]
parent --> children (boys,girls) 某些view需要,如果需要另外在建立一个JavaBean来表述这种情况,代码量和开发量都会增加。如果有中间的json tree,可以用迭代JSONArray中的JSONObject,用put方式增加2个JavaBean没有的属性,会方便很多。
还有种情况是Hibernate中的外键对象,例如User中的UserDetail有个faivorColor属性,而在ExtJs中需要在grid中使用这个属性,grid使用JSONStore,虽然用ValueFilter可以做到这样的转换,但使用起来不是很直观方便。
项目原本的使用Json-Lib,但json-lib从10年底就开始没有更新了。想转换个JSON序列化反序列化底层,Jackson视乎太偏爱annotation,动态的编程方式来控制json序列化不太方便,记起以前javaeye里看过fastjson介绍,决定采用试试,95%的代码转换都很好完成,唯独缺少转换JSONObject和JSONArray的方法。
请教一下温少,有没有可以用的例子:
Permalink
Reply
Jul 24, 2012
Anonymous
一个bug,如果某个类下面有一个这个属性
public transient List<LookupKeyword> lookupKeywords;
public List<LookupKeyword> getLookupKeywords()
Unknown macro: { return lookupKeywords; }
由eclipse自动生成的属性访问器的名称里的K字母是大写的情况下,JSON.toJSONString()方法返回时就会忽略掉这个属性,改成小写便 可。
Permalink
Reply
Aug 13, 2012
Anonymous
symbolTable会增长的特别大,这会不会影响性能?
应用运行两天,symbolTable中Entry的实例数都到28w了
Permalink
Reply
Fastjson内幕
JSON协议使用方便,越来越流行。JSON的处理器有很多,为什么需要再写一个呢?因为我们需要一个性能很好的JSON Parser,希望JSON Parser的性能有二进制协议一样好,比如和protobuf一样,这可不容易,但确实做到了。有人认为这从原理上就是不可能的,但是计算机乃实践科学,看实际的结果比原理推导更重要。
这篇文章告诉大家:
Fastjson究竟有多快
为什么Fastjson这么快
你能用Fastjson来做什么!
如何获得fastjson?
首先,Fastjson究竟有多快?
我们看一下使用https://github.com/eishay/jvm-serializers/提供的程序进行测试得到的结果:
序列化时间 反序列化时间 大小 压缩后大小
java序列化 8654 43787 889 541
hessian 6725 10460 501 313
protobuf 2964 1745 239 149
thrift 3177 1949 349 197
avro 3520 1948 221 133
json-lib 45788 149741 485 263
jackson 3052 4161 503 271
fastjson 2595 1472 468 251
测试数据:https://github.com/eishay/jvm-serializers/wiki/TestValue
这是一个468bytes的JSON Bytes测试,从测试结果来看,无论序列化和反序列化,Fastjson超越了protobuf,可以当之无愧fast! 它比java deserialize快超过30多倍,比json-lib快100倍。由于Fastjson的存在,你可以放心使用json统一协议,达到文本协议的可维护性,二进制协议的性能。
为什么Fastjson能够做到这么快?
JSON处理主要包括两个部分,serialize和deserialize。serialize就是把Java对象变成JSON String或者JSON Bytes。Deserialize是把JSON String或者Json Bytes变成java对象。其实这个过程有些JSON库是分三部分的,json string <-> json tree <-> java object。Fastjson也支持这种转换方式,但是这种转换方式因为有多余的步骤,性能不好,不推荐使用。
一、Fastjson中Serialzie的优化实现
1、自行编写类似StringBuilder的工具类SerializeWriter。
把java对象序列化成json文本,是不可能使用字符串直接拼接的,因为这样性能很差。比字符串拼接更好的办法是使用java.lang.StringBuilder。StringBuilder虽然速度很好了,但还能够进一步提升性能的,fastjson中提供了一个类似StringBuilder的类com.alibaba.fastjson.serializer.SerializeWriter。
SerializeWriter提供一些针对性的方法减少数组越界检查。例如public void writeIntAndChar(int i, char c) {},这样的方法一次性把两个值写到buf中去,能够减少一次越界检查。目前SerializeWriter还有一些关键的方法能够减少越界检查的,我还没实现。也就是说,如果实现了,能够进一步提升serialize的性能。
2、使用ThreadLocal来缓存buf。
这个办法能够减少对象分配和gc,从而提升性能。SerializeWriter中包含了一个char[] buf,每序列化一次,都要做一次分配,使用ThreadLocal优化,能够提升性能。
3、使用asm避免反射
获取java bean的属性值,需要调用反射,fastjson引入了asm的来避免反射导致的开销。fastjson内置的asm是基于objectweb asm 3.3.1改造的,只保留必要的部分,fastjson asm部分不到1000行代码,引入了asm的同时不导致大小变大太多。
4、使用一个特殊的IdentityHashMap优化性能。
fastjson对每种类型使用一种serializer,于是就存在class -> JavaBeanSerizlier的映射。fastjson使用IdentityHashMap而不是HashMap,避免equals操作。我们知道HashMap的算法的transfer操作,并发时可能导致死循环,但是ConcurrentHashMap比HashMap系列会慢,因为其使用volatile和lock。fastjson自己实现了一个特别的IdentityHashMap,去掉transfer操作的IdentityHashMap,能够在并发时工作,但是不会导致死循环。
5、缺省启用sort field输出
json的object是一种key/value结构,正常的hashmap是无序的,fastjson缺省是排序输出的,这是为deserialize优化做准备。
6、集成jdk实现的一些优化算法
在优化fastjson的过程中,参考了jdk内部实现的算法,比如int to char[]算法等等。
二、fastjson的deserializer的主要优化算法
deserializer也称为parser或者decoder,fastjson在这方面投入的优化精力最多。
1、读取token基于预测。
所有的parser基本上都需要做词法处理,json也不例外。fastjson词法处理的时候,使用了基于预测的优化算法。比如key之后,最大的可能是冒号":",value之后,可能是有两个,逗号","或者右括号"}"。在com.alibaba.fastjson.parser.JSONScanner中提供了这样的方法:
public void nextToken(int expect) {
for (;;) {
switch (expect) {
case JSONToken.COMMA: //
if (ch == ',') {
token = JSONToken.COMMA;
ch = buf[++bp];
return;
}
if (ch == '}') {
token = JSONToken.RBRACE;
ch = buf[++bp];
return;
}
if (ch == ']') {
token = JSONToken.RBRACKET;
ch = buf[++bp];
return;
}
if (ch == EOI) {
token = JSONToken.EOF;
return;
}
break;
// ... ...
}
}
从上面摘抄下来的代码看,基于预测能够做更少的处理就能够读取到token。
2、sort field fast match算法
fastjson的serialize是按照key的顺序进行的,于是fastjson做deserializer时候,采用一种优化算法,就是假设key/value的内容是有序的,读取的时候只需要做key的匹配,而不需要把key从输入中读取出来。通过这个优化,使得fastjson在处理json文本的时候,少读取超过50%的token,这个是一个十分关键的优化算法。基于这个算法,使用asm实现,性能提升十分明显,超过300%的性能提升。
{ "id" : 123, "name" : "魏加流", "salary" : 56789.79}
------ -------- ----------
在上面例子看,虚线标注的三个部分是key,如果key_id、key_name、key_salary这三个key是顺序的,就可以做优化处理,这三个key不需要被读取出来,只需要比较就可以了。
这种算法分两种模式,一种是快速模式,一种是常规模式。快速模式是假定key是顺序的,能快速处理,如果发现不能够快速处理,则退回常规模式。保证性能的同时,不会影响功能。
在这个例子中,常规模式需要处理13个token,快速模式只需要处理6个token。
实现sort field fast match算法的代码在这个类com.alibaba.fastjson.parser.deserializer.ASMDeserializerFactory,是使用asm针对每种类型的VO动态创建一个类实现的。
这里是有一个用于演示sort field fast match算法的代码: http://code.alibabatech.com/svn/fastjson/trunk/fastjson/src/test/java/data/media/ImageDeserializer.java
// 用于快速匹配的每个字段的前缀
char[] size_ = "\"size\":".toCharArray();
char[] uri_ = "\"uri\":".toCharArray();
char[] titile_ = "\"title\":".toCharArray();
char[] width_ = "\"width\":".toCharArray();
char[] height_ = "\"height\":".toCharArray();
// 保存parse开始时的lexer状态信息
int mark = lexer.getBufferPosition();
char mark_ch = lexer.getCurrent();
int mark_token = lexer.token();
int height = lexer.scanFieldInt(height_);
if (lexer.matchStat == JSONScanner.NOT_MATCH) {
// 退出快速模式, 进入常规模式
lexer.reset(mark, mark_ch, mark_token);
return (T) super.deserialze(parser, clazz);
}
String value = lexer.scanFieldString(size_);
if (lexer.matchStat == JSONScanner.NOT_MATCH) {
// 退出快速模式, 进入常规模式
lexer.reset(mark, mark_ch, mark_token);
return (T) super.deserialze(parser, clazz);
}
Size size = Size.valueOf(value);
// ... ...
// batch set
Image image = new Image();
image.setSize(size);
image.setUri(uri);
image.setTitle(title);
image.setWidth(width);
image.setHeight(height);
return (T) image;
3、使用asm避免反射
deserialize的时候,会使用asm来构造对象,并且做batch set,也就是说合并连续调用多个setter方法,而不是分散调用,这个能够提升性能。
4、对utf-8的json bytes,针对性使用优化的版本来转换编码。
这个类是com.alibaba.fastjson.util.UTF8Decoder,来源于JDK中的UTF8Decoder,但是它使用ThreadLocal Cache Buffer,避免转换时分配char[]的开销。
ThreadLocal Cache的实现是这个类com.alibaba.fastjson.util.ThreadLocalCache。第一次1k,如果不够,会增长,最多增长到128k。
//代码摘抄自com.alibaba.fastjson.JSON
public static final <T> T parseObject(byte[] input, int off, int len, CharsetDecoder charsetDecoder, Type clazz,
Feature... features) {
charsetDecoder.reset();
int scaleLength = (int) (len * (double) charsetDecoder.maxCharsPerByte());
char[] chars = ThreadLocalCache.getChars(scaleLength); // 使用ThreadLocalCache,避免频繁分配内存
ByteBuffer byteBuf = ByteBuffer.wrap(input, off, len);
CharBuffer charByte = CharBuffer.wrap(chars);
IOUtils.decode(charsetDecoder, byteBuf, charByte);
int position = charByte.position();
return (T) parseObject(chars, position, clazz, features);
}
5、symbolTable算法。
我们看xml或者javac的parser实现,经常会看到有一个这样的东西symbol table,它就是把一些经常使用的关键字缓存起来,在遍历char[]的时候,同时把hash计算好,通过这个hash值在hashtable中来获取缓存好的symbol,避免创建新的字符串对象。这种优化在fastjson里面用在key的读取,以及enum value的读取。这是也是parse性能优化的关键算法之一。
以下是摘抄自JSONScanner类中的代码,这段代码用于读取类型为enum的value。
int hash = 0;
for (;;) {
ch = buf[index++];
if (ch == '\"') {
bp = index;
this.ch = ch = buf[bp];
strVal = symbolTable.addSymbol(buf, start, index - start - 1, hash); // 通过symbolTable来获得缓存好的symbol,包括fieldName、enumValue
break;
}
hash = 31 * hash + ch; // 在token scan的过程中计算好hash
// ... ...
}
我们能用fastjson来作什么?
1、替换其他所有的json库,java世界里没有其他的json库能够和fastjson可相比了。
2、使用fastjson的序列化和反序列化替换java serialize,java serialize不单性能慢,而且体制大。
3、使用fastjson替换hessian,json协议和hessian协议大小差不多一样,而且fastjson性能优越,10倍于hessian
4、把fastjson用于memached缓存对象数据。
如何获得fastjson
官方网站
Fastjson是开源的,基于Apache 2.0协议。你可以在官方网站了解最新信息。 http://code.alibabatech.com/wiki/display/FastJSON/Home
maven用户
Maven仓库 http://code.alibabatech.com/mvn/releases/
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.2</version>
</dependency>
Downlaods
Binary : http://code.alibabatech.com/mvn/releases/com/alibaba/fastjson/1.1.2/fastjson-1.1.2.jar
Source :http://code.alibabatech.com/mvn/releases/com/alibaba/fastjson/1.1.2/fastjson-1.1.2-sources.jar
Subversion : http://code.alibabatech.com/svn/fastjson/trunk/fastjson/
Labels:
None
28 Comments comments.show.hide
Aug 15, 2011
Anonymous
有个很奇怪的问题,无论是用json-lib还是jackson,还是你的Fastjson,都无法解析Map中key object,比如Map<CustomerObject1,CustomerObject2>,奇怪的地方在于作为value的CustomerObject2可以直接转换为json字符串,但作为key的CustomerObject1只是一个很普通的java bean,却无法转换,每次都显示的是hashcode,这是什么原因呢?按理来说做到应该不复杂啊,而且CustomerObject1还是重写了hashcode和equals方法的,求解啊
Permalink
Reply
Aug 18, 2011
温 少
这局限于json的标准,考虑实现这个功能。
Permalink
Reply
Dec 10, 2011
Anonymous
Map的key本来就是由对象hash过来的,难道你能再根据hashcode反算出对象?
不靠谱
Permalink
Reply
Sep 16, 2011
Anonymous
class A<T>
Unknown macro: { Map<String,T> attribute = new HashMap<String,T>(); }
A<MyClass> a = new A<MyClass>();
String json = JSON.toJSONString(a);
JSON.parseObject(json, new TypeReference<MyClass>() {});
这样为什么MyClass转不回来额?是写的不对还是本来不支持?
Permalink
Reply
Sep 16, 2011
Anonymous
温少有没有测试国JSEL.
JSEL 中也有一个性能不错的JSON工具:
http://code.google.com/p/lite/wiki/JSON
Permalink
Reply
Mar 12, 2012
Anonymous
Woah nelly, how about them aplpes!
Permalink
Reply
Sep 21, 2011
Anonymous
fastjson跟Gson的性能做过对比吗?另外,fastjson可以在Android手机平台上吗?Android平台上也是用java编程语言的
Permalink
Reply
Sep 22, 2011
Anonymous
fastjson有没有对webservice的支持,比如cxf的jsonProvider
Permalink
Reply
Mar 12, 2012
Anonymous
I've been loiokng for a post like this forever (and a day)
Permalink
Reply
Mar 13, 2012
Anonymous
tFUMWN <a href="http://hjpoqziqdyuf.com/">hjpoqziqdyuf</a>
Permalink
Reply
Mar 13, 2012
Anonymous
16UTi1 , yhegfvcflzgp, [link=http://crwwcybyxeeh.com/]crwwcybyxeeh[/link], http://xpivegnnlqbk.com/
Permalink
Reply
Mar 13, 2012
Anonymous
Z6f9y0 <a href="http://wzdyvzlwfkpn.com/">wzdyvzlwfkpn</a>
Permalink
Reply
Mar 16, 2012
Anonymous
Em1NEX , jzlidchlqxfu, [link=http://jwjxiuchxikc.com/]jwjxiuchxikc[/link], http://gushgcoigxrd.com/
Permalink
Reply
Oct 13, 2011
Anonymous
发现一给我问题,使用fastjson在做测试时,如果实体对象的属性是以大写字母开头(特殊情况)的下,如果使用fastjson将对象集合转换成json字符串的时候,fastjson会自动把以大写字母开头的的对象的属性的头一个字母自动更改成小写的,这样如果在前台页面还是按照实体对象中定义的属性使用javascript迭代取值时,就会出项undefined的错误。不过,把通过fastjson转化后的json字符串再转换成java的实体对象后再取值却没有影响,可以正常取到。
如:
User.java
——————————————————————————————————————————————————————————
……
private String id;
private String name;
private int age;
private boolean marriage;
private String SOMETHING;//此处定义的属性全部都是大写字母
……
——————————————————————————————————————————————————————————
JsonTest.java
——————————————————————————————————————————————————————————
……
User u=new User();
u.setAge(111);
u.setId("100");
u.setMarriage(Boolean.FALSE);
u.setName("hety");
u.setSOMETHING("中华人民共和国");
User u2=new User();
u2.setAge(222);
u2.setId("101");
u2.setMarriage(Boolean.TRUE);
u2.setName("张三");
u2.setSOMETHING("测试测试测试");
List<User> list=new ArrayList<User>();
list.add(u);
list.add(u2);
String json=JSON.toJSONString(list);
System.out.println(json);
……
最后一行打印如下:
Unknown macro: {"age"}
fastjson并没有严格按照实体对象中定义的属性来输出“SOMETHING”,而是输出了“sOMETHING”,这个算不算一个bug呢?
email: xx23344@qq.com
Permalink
Reply
Oct 13, 2011
Anonymous
发现一个问题,使用fastjson在做测试时,如果实体对象的属性是以大写字母开头(特殊情况)的下,如果使用fastjson将对象集合转换成json字符串的时候,fastjson会自动把以大写字母开头的的对象的属性的头一个字母自动更改成小写的,这样如果在前台页面还是按照实体对象中定义的属性使用javascript迭代取值时,就会出项undefined的错误。不过,把通过fastjson转化后的json字符串再转换成java的实体对象后再取值却没有影响,可以正常取到。
如:
User.java
——————————————————————————————————————————————————————————
……
private String id;
private String name;
private int age;
private boolean marriage;
private String SOMETHING;//此处定义的属性全部都是大写字母
……
——————————————————————————————————————————————————————————
JsonTest.java
——————————————————————————————————————————————————————————
……
User u=new User();
u.setAge(111);
u.setId("100");
u.setMarriage(Boolean.FALSE);
u.setName("hety");
u.setSOMETHING("中华人民共和国");
User u2=new User();
u2.setAge(222);
u2.setId("101");
u2.setMarriage(Boolean.TRUE);
u2.setName("张三");
u2.setSOMETHING("测试测试测试");
List<User> list=new ArrayList<User>();
list.add(u);
list.add(u2);
String json=JSON.toJSONString(list);
System.out.println(json);
……
最后一行打印如下:
Unknown macro:
Unknown macro: {"age"}
fastjson并没有严格按照实体对象中定义的属性来输出“SOMETHING”,而是输出了“sOMETHING”,这个算不算一个bug呢?
email: xx23344@qq.com
Permalink
Reply
Oct 13, 2011
Anonymous
发现一给我问题,使用fastjson在做测试时,如果实体对象的属性是以大写字母开头(特殊情况)的下,如果使用fastjson将对象集合转换成json字符串的时候,fastjson会自动把以大写字母开头的的对象的属性的头一个字母自动更改成小写的,这样如果在前台页面还是按照实体对象中定义的属性使用javascript迭代取值时,就会出项undefined的错误。不过,把通过fastjson转化后的json字符串再转换成java的实体对象后再取值却没有影响,可以正常取到。
如:
User.java
——————————————————————————————————————————————————————————
……
private String id;
private String name;
private int age;
private boolean marriage;
private String SOMETHING;//此处定义的属性全部都是大写字母
……
——————————————————————————————————————————————————————————
JsonTest.java
——————————————————————————————————————————————————————————
……
User u=new User();
u.setAge(111);
u.setId("100");
u.setMarriage(Boolean.FALSE);
u.setName("hety");
u.setSOMETHING("中华人民共和国");
User u2=new User();
u2.setAge(222);
u2.setId("101");
u2.setMarriage(Boolean.TRUE);
u2.setName("张三");
u2.setSOMETHING("测试测试测试");
List<User> list=new ArrayList<User>();
list.add(u);
list.add(u2);
String json=JSON.toJSONString(list);
System.out.println(json);
……
最后一行打印如下(以下都是用中文的符号,要不正常显示不了):
{“age":222,"id":"101","marriage":true,"name":"张三","sOMETHING":"测试测试测试"}
fastjson并没有严格按照实体对象中定义的属性来输出“SOMETHING”,而是输出了“sOMETHING”,这个算不算一个bug呢?
email: xx23344@qq.com
Permalink
Reply
Nov 02, 2011
Anonymous
我测试fastjson反序列化效率最高,但是序列化运行效率却远低于jackson和gson,详细看 http://www.iteye.com/topic/1113183?page=7#2269699
Permalink
Reply
Feb 29, 2012
Anonymous
FastJson是不是不能像jsonLib一样能对JSON字符串中元素的key进行拼写检查。
比如下面这段代码
try
Unknown macro: { businessId=jsonObject.getLong("bid"); }
catch(Exception e)
{
}
在JSONLib中如果bid没有拼写正确,则会抛出异常
但在FastJson好像不会。
Permalink
Reply
Mar 12, 2012
Anonymous
What's it take to become a sublime expounder of prose like yroeuslf?
Permalink
Reply
Mar 13, 2012
Anonymous
psRYhN , trxacbekjfts, [link=http://cvcnkpwnwioa.com/]cvcnkpwnwioa[/link], http://elipeltozheq.com/
Permalink
Reply
Mar 13, 2012
Anonymous
lHmDxJ <a href="http://vfmmnevwhmzi.com/">vfmmnevwhmzi</a>
Permalink
Reply
Mar 16, 2012
Anonymous
NDmOiP , jdpsennnfjiw, [link=http://hveiofuofoty.com/]hveiofuofoty[/link], http://rkgfhsbmewjs.com/
Permalink
Reply
Mar 26, 2012
Anonymous
定义了一个 List<T> list;
...
JSON.toJSONString(list)
出现 .......},{"customer":{"$ref":"$[1].customer" 问题
二条数据,不能有相同的实体类?
Permalink
Reply
Apr 27, 2012
Anonymous
想要一个注解比如名字叫@JSONDisField,使用了此注解,则在javabean转换为json的时候丢弃此字段
Permalink
Reply
Jun 02, 2012
Anonymous
我使用eclipse for javaee,tomcat7.0+,JDK 1.6+
为什么在javase中正常,但在javaee中,比如servlet或者jsp中,不能执行,出现JSON cannot be resolved错误,重新导入好多次了。
.....
String jsonTest="test json";
String str=JSON.toJSONString(jsonTest);//这句出现java.lang.ClassNotFoundException异常。
.....
好几个版本都是这样,使用google的Gson也是这样。
Permalink
Reply
Jul 24, 2012
Anonymous
搜索了源码,没有找到 如何转换java object 到 json tree的api,wiki中提到可以支持:
json string <-> json tree <-> java object
json tree虽然会减慢速度,但在如下场景还是有需要的:
[{parent-name:'fast',boys-num:2,girls-num:1},
{parent-name:'json',boys-num:1,girls-num:2}]
parent --> children (boys,girls) 某些view需要,如果需要另外在建立一个JavaBean来表述这种情况,代码量和开发量都会增加。如果有中间的json tree,可以用迭代JSONArray中的JSONObject,用put方式增加2个JavaBean没有的属性,会方便很多。
还有种情况是Hibernate中的外键对象,例如User中的UserDetail有个faivorColor属性,而在ExtJs中需要在grid中使用这个属性,grid使用JSONStore,虽然用ValueFilter可以做到这样的转换,但使用起来不是很直观方便。
项目原本的使用Json-Lib,但json-lib从10年底就开始没有更新了。想转换个JSON序列化反序列化底层,Jackson视乎太偏爱annotation,动态的编程方式来控制json序列化不太方便,记起以前javaeye里看过fastjson介绍,决定采用试试,95%的代码转换都很好完成,唯独缺少转换JSONObject和JSONArray的方法。
请教一下温少,有没有可以用的例子:
Permalink
Reply
Jul 24, 2012
Anonymous
一个bug,如果某个类下面有一个这个属性
public transient List<LookupKeyword> lookupKeywords;
public List<LookupKeyword> getLookupKeywords()
Unknown macro: { return lookupKeywords; }
由eclipse自动生成的属性访问器的名称里的K字母是大写的情况下,JSON.toJSONString()方法返回时就会忽略掉这个属性,改成小写便 可。
Permalink
Reply
Aug 13, 2012
Anonymous
symbolTable会增长的特别大,这会不会影响性能?
应用运行两天,symbolTable中Entry的实例数都到28w了
Permalink
Reply
相关推荐
json paser 属于idea插件 用于解析json json paser 属于idea插件 用于解析json json paser 属于idea插件 用于解析json json paser 属于idea插件 用于解析json json paser 属于idea插件 用于解析json json paser 属于...
最好用的c++json库 nlohmann json源代码最好用的c++json库 nlohmann json源代码最好用的c++json库 nlohmann json源代码最好用的c++json库 nlohmann json源代码最好用的c++json库 nlohmann json源代码最好用的c++json...
json11::Json jsonObject = json11::Json::parse(jsonString); if (jsonObject.is_object()) { // 处理解析成功的对象 } else { // 处理解析错误 } ``` 一旦你有了JSON对象,可以访问其成员或进行修改。例如,...
json3.js 【JS / JavaScript 中解析JSON的js包,JSON官方的JSON解析包】。JavaScript中解析JSON的js包,页面中引入json3.js,即可使用。 使用方法:JSON.parse(str), JSON.stringify(obj) 更多详情请参考博文: ...
Java JSON API是Java平台上的库,提供了处理JSON的能力,包括解析JSON字符串、生成JSON对象以及进行JSON与Java对象之间的转换。 在Java中,有多种实现JSON API的库,如Jackson、Gson、org.json和json-lib等。本篇...
而JSON Schema则是一个JSON格式的规范,用于定义JSON数据的结构和限制,类似于XML Schema,它为JSON数据提供了验证规则,确保数据的准确性和一致性。 在JavaScript开发中,有时我们需要将JSON对象转换为JSON Schema...
在这个例子中,我们首先使用`json_tokener_parse`解析JSON字符串,然后通过`json_object_get_string`和`json_object_get_int`获取JSON对象中的数据,最后使用`json_object_put`释放内存。这就是`json-c`库基本的使用...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于Web服务和应用程序之间的数据传输。它易于人阅读和编写,同时也易于机器解析和生成。`net.sf.json`是开源项目Apache软件基金会下的一个...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于Web应用程序之间传输数据。它以文本形式存储和传递数据,易于人阅读和编写,同时也易于机器解析和生成。`net.sf.json`是开源Java库,它...
jsonview是chrome浏览器的一个插件,用来在浏览器中查看json数据。比如你在浏览器中可以查看从服务器端传回来的json数据,这些数据可能没有经过格式化的,也或者是经过了unicode编码,没有缩进,没有换行等等,造成...
C# json格式转换,Json格式字符串与C#对象相互转换,类库和测试demo 写了一个json与C#对象相互装换的类库,直接调用就行,有测试案例,代码注释非常详细 部分方法: /// 将Json字符串解析为C#中的对象 /// Json格式...
可能包含的方法有`toJson()`(将Java对象转换为JSON字符串)、`fromJson()`(将JSON字符串解析为Java对象)、`convertToMap()`(将JSON字符串转换为Map)以及`convertToList()`(将JSON字符串转换为List)等。...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在PHP中,JSON常用于与前端交互,传输数据。PHP 4.0版本虽然相对较旧,但仍然可以处理JSON数据,只是...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛应用于Web服务与客户端之间的数据传输。它易于人阅读和编写,同时也易于机器解析和生成。JSON文件通常以.js或.json为扩展名,其数据结构主要...
这篇关于“经典ASP读取JSON字符串/生成JSON对象,数组对象等”的知识将详细介绍如何在ASP环境中处理JSON数据。 1. **JSON对象与数组的结构**: JSON对象以大括号{}表示,键值对之间用逗号分隔。键必须是字符串,用...
**JsonSQL: SQL语句解析JSON文件** 在大数据处理和Web应用中,JSON(JavaScript Object Notation)格式已经成为数据交换的常见格式。然而,对于习惯使用SQL查询关系型数据库的人来说,处理JSON数据可能会觉得不太...
标题中的“PB解析json,解析JSON案例,解析jsondemo”表明了本文主要关注的是PowerBuilder(简称PB)如何处理JSON数据。在现代软件开发中,JSON(JavaScript Object Notation)是一种广泛使用的轻量级数据交换格式,...
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,它基于JavaScript的一个子集,易于人阅读和编写,同时也易于机器解析和生成。在Web开发中,JSON被广泛用于前后端数据传输,因为它简洁、直观且易于...
**Newtonsoft.Json.dll详解** `Newtonsoft.Json.dll`是一个由James Newton-King 开发的流行的JSON库,专门用于.NET框架的开发。它在Unity引擎中广泛使用,因为Unity支持C#编程,而`Newtonsoft.Json`库提供了强大的...
将json转换为javebean的工具,封装jsonschema2pojo,用户可以修改配置文件json2Beans.json,然后运行Json2JavaBean2.bat直接生成对应类。 能够批量转换json为bean,直接拷贝到项目中使用。 提醒: 需要提前安装java...