本文目录一览:
- 1、Android json解析架包(阿里巴巴的fastjson)处理是报异常。
- 2、复杂json怎么使用fastjson一次性提取出来
- 3、Jackson和FastJson性能谁更快
- 4、java-fastJson:请问下面代码有什么错?为什么打印出来后numString始终为空呢?
- 5、Fastjson 1.83漏洞利用猜想
- 6、fastjson是怎么实现JSON的序列化和反序列化的
Android json解析架包(阿里巴巴的fastjson)处理是报异常。
应该是json字符串的格式有问题吧,先找找看有问题没有,没有的话再看解析的时候哪里有逻辑问题没有,不行就把报错的那几行代码和json字符串贴出来,帮你看看能不能找到哪里有问题
复杂json怎么使用fastjson一次性提取出来
JSON数据之使用Fastjson进行解析(一)
据说FastJson是目前最快的解析Json数据的库,而且是国人开发出来的开源库。顶一下,付上官方网址:h/code.alibabatech.com/wiki/pages/viewpage.action?pageId=2424946
要使用Fastjson,首先需要下载相对应的jar文件,在官网即可下载。
附上初学的第一个例子,多多指教:
复制代码
{
"statuses":[
{
"id": 912345678901,
"text": "How do I stream JSON in Java?",
"geo": null,
"user": {
"name": "json_newb",
"followers_count": 41
}
},
{
"id": 777777777888,
"text": "dfngsdnglnsldfnsl",
"geo": null,
"user": {
"name": "dsfgpd",
"followers_count": 24
}
}
]
}
复制代码
AllBean的Bean类:
复制代码
package com.lee.JsonToBean;
public class AllBean {
private long id;
private String text;
private String geo;
private UserBean userBean;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String getGeo() {
return geo;
}
public void setGeo(String geo) {
this.geo = geo;
}
public UserBean getUserBean() {
return userBean;
}
public void setUserBean(UserBean userBean) {
this.userBean = userBean;
}
}
复制代码
UserBean的Bean类:
复制代码
package com.lee.JsonToBean;
public class UserBean {
private String name;
private int followers_count;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getFollowers_count() {
return followers_count;
}
public void setFollowers_count(int followers_count) {
this.followers_count = followers_count;
}
}
复制代码
解析类JsonBean:
复制代码
package com.lee.JsonToBean;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.rtf.RTFEditorKit;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
/**
* {
"statuses":[
{
"id": 912345678901,
"text": "How do I stream JSON in Java?",
"geo": null,
"user": {
"name": "json_newb",
"followers_count": 41
}
},
{
"id": 777777777888,
"text": "dfngsdnglnsldfnsl",
"geo": null,
"user": {
"name": "dsfgpd",
"followers_count": 24
}
}
]
}
* */
public class JsonBean {
RTFEditorKit rtf;
DefaultStyledDocument dsd;
String text;
public static void main(String[] args) {
JsonBean bean = new JsonBean();
// 把字符串转为Json对象,这是因为我的json数据首先是json对象
JSONObject jobj = JSON.parseObject(bean.readRtf(new File("json.rtf")));
// 然后是jsonArray,可以根据我的json数据知道
JSONArray arr = jobj.getJSONArray("statuses");
// 根据Bean类的到每一个json数组的项
ListAllBean listBeans = JSON.parseArray(arr.toString(), AllBean.class);
// 遍历
for(AllBean bean_ : listBeans){
// 我这个demo的json数据获得第一层的数据
System.out.println(bean_.getText());
System.out.println(bean_.getId());
// 我这个demo的json数据获得第二层的数据
System.out.println(bean_.getUserBean().getFollowers_count());
}
}
// 因为我把json数据放进rtf文件,这是读取rtf文件的json数据,转化为字符串
public String readRtf(File in) {
rtf=new RTFEditorKit();
dsd=new DefaultStyledDocument();
try {
rtf.read(new FileInputStream(in), dsd, 0);
text = new String(dsd.getText(0, dsd.getLength()));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BadLocationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return text;
}
}
Jackson和FastJson性能谁更快
Fastjson快,但是和jackson 的差距不大,优势并没有太明显。Jackson还可以加上AfterBurner来使用byte generation,这样和Fastjson的差距就更小了。
除了速度胜出外,Fastjson相比较 Jackson 有不少短板。
1. 可定制性
Jackson有灵活的API,可以很容易进行扩展和定制,而且很多时候需要的模块都已经有人提供了。比如guava中定义的数据类型,比如kotlin语言Immutable的类型等,比如java8 引入的新日期时间类型和Optional都已经有支持的模块。
FastJson只有一个(简陋)的SerializeFilter机制用来定制序列化,ParseProcess机制用来定制反序列化,每次调用序列化/反序列化的的时候都要自己传filter或者Process这个参数过去,Jackson和 Gson都是直接注册模块就可以了,Jackson还可以使用SPI来自动发现和注册模块。
2. 代码质量
公司有一些项目使用了fastjson,在使用fastjson的项目里面碰到的两个低级bug:
1. 碰到在128~255 的字符直接异常,这些主要是西欧语言的字符,因为他用一个数组来记录 转义后的字符表示,但是数组长度只有128...
2. 内存占用过多。Fastjson为了性能,在ThreadLocal中缓存了char[] buffer,这样避免分配内存和gc的开销。但是如果碰到了大的json(比如10M这样的),就会占用大量的内存,而且以后都是处理小json了内存占用也回不来。
这些问题虽然后来的版本都修复了,但是也反映出Fastjson代码质量上要求不够严格。 而Jackson这么多年来使用上还没有碰到过这样的Bug.
3. 文档
英文文档缺乏已有的也不规范,相比较国内用户还多些。
java-fastJson:请问下面代码有什么错?为什么打印出来后numString始终为空呢?
public class User{ //user类改成这样,其他不用改
public int a=0;
public String b="";
public boolean c=false;
User(){ }
}
Fastjson 1.83漏洞利用猜想
在不久前fastjson1.2.83又爆出来了新的问题,详细内容可以参考 ,这篇文章主要是抛转引玉,写一种可能的利用思路,详细的利用链可能要等大佬们来给出了。
文内如有不妥之处,还请批评指正。
特定依赖存在下影响 ≤1.2.80
首先看白名单对比:
这里参考之前git上的白名单列表
像org.springframework中的基本全部从白名单中剔除了。
并且更改了判断方式,if (typeName.endsWith("Exception") || typeName.endsWith("Error"))
那么这里就可以猜测本次影响的方式,就是和被剔除的内容相关。这里用org.springframework.dao.CannotAcquireLockException进行测试,可以发现实际上最终调用的类是Throwable。
那么如果是要找gadget的话,就需要从黑名单下手了。本文不做分析和介绍,有兴趣找gadget的话可以去研究研究。
需要使用1.2.80和1.2.83的fastjson jar包进行测试。
maven
demo:
上重点从checkAutoType开始,简单的说一下判断过程。
首先是判断safeModeMask,通常默认是不会开的。
检测黑名单
通过黑白名单的检测,就会尝试从Mapping中获取类
走到这里如果是白名单里的内容会尝试进行加载。
并且会直接拿到对应的类,不会再进行接下来的校验。
由于存在继承调用关系,所以在进行加载的时候就会加载f1283,并且会重新进行checkAutoType的判定。
检测过程中会先将expectClassFlag置为true。
接着检测黑名单内容,Mapping获取以及白名单检测无果之后会对clazz的类型进行校验。
接着会进行新一轮的检测。
检测通过之后,会进行类继承关系判断,实际上只要继承关系正确,就会直接进行反序列化。
最后的结果
如果直接使用java.lang.Throwable会直接抛出异常。
我们来跟一下可以很清楚的看到,Throwable既不是黑名单,也不是白名单,也不是mapping中的内容。
那么在流程中就会将这个类当做一个普通的类来进行处理,通过判断autoTypeSupport为未开启的状态,从而进行抛出处理。
fastjson是怎么实现JSON的序列化和反序列化的
GitHub - alibaba/fastjson: Fast JSON Processor
如果题主只是问序列化和反序列化部分,而不注重JSON的语法分析部分的话,fastjson的序列化和反序列化都是通过动态生成类来避免重复执行时的反射开销的。
动态生成序列化器的类的代码可以从这里开始看:fastjson/ASMSerializerFactory.java at master · alibaba/fastjson · GitHub
动态生成反序列化器的类的代码可以从这里开始看:fastjson/DeserializerGen.java at master · alibaba/fastjson · GitHub