fastjson代码分析,fastjson trim

本文目录一览:

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

原创文章,作者:SZCX,如若转载,请注明出处:https://www.506064.com/n/148918.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
SZCXSZCX
上一篇 2024-11-04 17:50
下一篇 2024-11-04 17:50

相关推荐

  • Python周杰伦代码用法介绍

    本文将从多个方面对Python周杰伦代码进行详细的阐述。 一、代码介绍 from urllib.request import urlopen from bs4 import Bea…

    编程 2025-04-29
  • Python字符串宽度不限制怎么打代码

    本文将为大家详细介绍Python字符串宽度不限制时如何打代码的几个方面。 一、保持代码风格的统一 在Python字符串宽度不限制的情况下,我们可以写出很长很长的一行代码。但是,为了…

    编程 2025-04-29
  • Python基础代码用法介绍

    本文将从多个方面对Python基础代码进行解析和详细阐述,力求让读者深刻理解Python基础代码。通过本文的学习,相信大家对Python的学习和应用会更加轻松和高效。 一、变量和数…

    编程 2025-04-29
  • 仓库管理系统代码设计Python

    这篇文章将详细探讨如何设计一个基于Python的仓库管理系统。 一、基本需求 在着手设计之前,我们首先需要确定仓库管理系统的基本需求。 我们可以将需求分为以下几个方面: 1、库存管…

    编程 2025-04-29
  • Python满天星代码:让编程变得更加简单

    本文将从多个方面详细阐述Python满天星代码,为大家介绍它的优点以及如何在编程中使用。无论是刚刚接触编程还是资深程序员,都能从中获得一定的收获。 一、简介 Python满天星代码…

    编程 2025-04-29
  • 写代码新手教程

    本文将从语言选择、学习方法、编码规范以及常见问题解答等多个方面,为编程新手提供实用、简明的教程。 一、语言选择 作为编程新手,选择一门编程语言是很关键的一步。以下是几个有代表性的编…

    编程 2025-04-29
  • Python实现简易心形代码

    在这个文章中,我们将会介绍如何用Python语言编写一个非常简单的代码来生成一个心形图案。我们将会从安装Python开始介绍,逐步深入了解如何实现这一任务。 一、安装Python …

    编程 2025-04-29
  • 怎么写不影响Python运行的长段代码

    在Python编程的过程中,我们不可避免地需要编写一些长段代码,包括函数、类、复杂的控制语句等等。在编写这些代码时,我们需要考虑代码可读性、易用性以及对Python运行性能的影响。…

    编程 2025-04-29
  • 北化教务管理系统介绍及开发代码示例

    本文将从多个方面对北化教务管理系统进行介绍及开发代码示例,帮助开发者更好地理解和应用该系统。 一、项目介绍 北化教务管理系统是一款针对高校学生和教职工的综合信息管理系统。系统实现的…

    编程 2025-04-29
  • Python爱心代码动态

    本文将从多个方面详细阐述Python爱心代码动态,包括实现基本原理、应用场景、代码示例等。 一、实现基本原理 Python爱心代码动态使用turtle模块实现。在绘制一个心形的基础…

    编程 2025-04-29

发表回复

登录后才能评论