fastjson使用心得

本文分享了fastjson的使用心得,强调其无需额外环境依赖、速度快的特点。介绍了如何利用@JSONField进行序列化控制,包括忽略字段、指定序列化格式等。还提到了通过JSONPath提取集合对象,以及快速将JSON封装为Java对象的方法,并推荐了Chrome的JSON查看插件JSONView。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        喜欢fastjson,因为只需要依赖JDK,其他环境都不需要依赖就可以使用。而且它非常的快。这里我也把使用它的一些感悟和总结写出来,供大家指正。

        说到fastjson,我们就要懂得一个概念就是序列化:将对象信息转换为可以传输和存储的信息【百度百科】

        我们不需要一个字段的时候我们可以通过@JSONFiled(serialize=false) 来不序列化,默认JSONFiled类里面serialize和deserialize都是true

        @JSONFiled()里面有很多参数可以去设置,比如时间的类型@JSONFiled(format="yyyyMMdd HHmmss"),也可以指定在序列化时的名字。

    @Id
    @Column(name = "id")
    @JSONField(name = "ID")
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    public int getId() {
        return id;
    }
       比如我们在上面指定序列化后名字为“ID”。

      

      fastjson还有一个优点就是和java中的实体类有很好的融合。我们定义好的实体类。然后我们在返回给前端使用的时候,有一些字段我们是不需要或者前端不要求提供的。所以我们可以用过滤器把它过滤掉。

   SimplePropertyPreFilter filter = new SimplePropertyPreFilter(FundEntity.class,"ID","contractContent","fixtureTime","contractContent","typeName","dealMark","transactionAmount");
   return  JSON.toJSONString(new BaseModel(Constants.SUCCESS_CODE,fundLists2),filter);
      这样返回的字段就是我们Filter里面定义的规定字段。

      当我们按顺序输出相关的列,我们可以在输出的model类中加入注解@JSONField(ordinal=0) ..  如下:

        @JSONField(ordinal = 0)
        private String code;
        @JSONField(ordinal = 1)
        private Map<String,String> myGroup;
        @JSONField(ordinal = 2)
        private Map<String,String> addGroup;

      另外我们在持有对象的时候需要返回相关信息,就会解析错误,比如解析成$ref这样的对象类型,我们就可以在解析的时候做一些处理(加了红色的标注部分),如下:

   return JSON.toJSONString(new BaseModel(Constants.SUCCESS_CODE,resultList),filter,<strong><span style="color:#ff0000;">SerializerFeature.DisableCircularReferenceDetect</span></strong>);

     还有一些不经常使用的类库,其实功能还是比较强大,JSONPath:

package ms.fastjson;

import java.util.ArrayList;
import java.util.List;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONPath;

public class JSONPathTest {
	public static void main(String[] args) {
		List<MyEntity> entities = new ArrayList<MyEntity>();
		entities.add(new MyEntity(1001, "ljw1001"));
		entities.add(new MyEntity(1002, "yan1002"));
		entities.add(new MyEntity(1003, "asw1003"));
		entities.add(new MyEntity(1004, null));
		
		/**
		 * 把fastjson当查询来用,不知道这种效率怎么样,比起ID查询来看
		 * [id in (1001,1003)]  按特定ID来筛选集合中的元素
		 * [0,2] 按下标来筛选集合中的元素,返回下标中0和2的元素
		 * [0:2] 按下标来筛选集合中的元素,返回下标中0-2的元素
		 * $.name 返回MyEntity中所有的name
		 * 
		 */
		List<MyEntity> result =  (List<MyEntity>)JSONPath.eval(entities, "[id in (1001,1003)]");
		List<MyEntity> result1 =  (List<MyEntity>)JSONPath.eval(entities, "[0,2]");
		List<MyEntity> result2 =  (List<MyEntity>)JSONPath.eval(entities, "[0:2]");
		List<MyEntity> result3 =  (List<MyEntity>)JSONPath.eval(entities, "$.name");
		MyEntity myEntity = result.get(0);
		//System.out.println(result3);
		
		
		MyEntity myEntity2 = new MyEntity(1005,"asd1005","String Object");
		String value = (String)JSONPath.eval(myEntity2, "$.value");
		System.out.println(value);
		
		//是否有value元素
		boolean isContain = JSONPath.containsValue(myEntity2, "$.value", myEntity2.getValue());
		System.out.println(isContain);
		
		int size = JSONPath.size(myEntity2, "$");
		System.out.println(size);

	}

}

class MyEntity{
	private int id;
	private String name;
	private Object value;
	public MyEntity(){	
	}
	public MyEntity(int id,String name){
		this.id = id;
		this.name = name;
	}
	public MyEntity(int id,String name,Object value){
		this(id,name);
		this.value = value;
	}
	@Override
	public String toString() {
		return "MyEntity [id=" + id + ", name=" + name + "]";
	}

	//getter and setter
}
        ParseProcess的用法:

package ms.fastjson;

import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.deserializer.ExtraProcessor;
import com.alibaba.fastjson.parser.deserializer.ExtraTypeProvider;

public class VO {
	private int id;
    private Map<String, Object> attributes = new HashMap<String, Object>();
    public int getId() { return id; }
    public void setId(int id) { this.id = id;}
    public Map<String, Object> getAttributes() { return attributes;}
    
    public static void main(String[] args) {
    	ExtraProcessor processor = new MyExtraProcessor();

    	VO vo = JSON.parseObject("{\"id\":123,\"value\":\"123456\"}", VO.class, processor);
    	System.out.println(vo.getId());
    	//value被强行转成了Integer类型了
    	System.out.println(vo.getAttributes().get("value"));
	}
}


class MyExtraProcessor implements ExtraProcessor, ExtraTypeProvider {
    public void processExtra(Object object, String key, Object value) {
        VO vo = (VO) object;
        vo.getAttributes().put(key, value);
    }

    public Type getExtraType(Object object, String key) {
        if ("value".equals(key)) {
            return int.class;
        }
        return null;
    }
};

     提取JSON字符串里面的集合对象

        当然我们也可以使用fastJson 来解析JSON字符串,比如我们有如下的JSON串。

{
  "code": "00",
  "t": [
    {
      "chargeFree": 0,
      "date": "12-03 19:12",
      "showProdKeyName": "欧元/美元",
      "userImg": "http://116.31.94.164:8090/market-master-gateway/resources/images/upload",
      "verifyFlg": 0,
      "praiseCount": 0,
      "readCount": 0,
      "ifForward": 0,
      "points": 50,
      "ifSuccess": 0,
      "targetPrice": "1.0624"}
 ]
}

      我们想解析把 t 解析成一个对象,使用如下的方式:

         JSONObject jsonObject = JSONObject.parseObject(str);
		
	 String data = jsonObject.get("t").toString();
	 List<ViewPointEntity> lists = JSON.parseArray(data,ViewPointEntity.class);

当然省略一下中间的步骤也是可以的,可以用下面更好的方式:

        List<ViewPointEntity> lists = (List<ViewPointEntity>)(JSON.parseObject(str).get(t));

     提取json,直接封装成对象

       例如json对象是如下格式:

{
        "ID": 515697,
        "chargeFree": 0,
        "commentCount": 0,
        "confidence": "30"
}

       可以通过下面的代码进行字符串转成对象操作:

    ViewPointEntity viewpoint = JSON.parseObject(msg,ViewPointEntity.class);



     就可以把上面的 t 转换成一个List了,然后就可以操作啦

     另外我们可以让Chrome浏览器加载一个JSON的识别插件   项目地址:https://github.com/gildas-lormeau/JSONView-for-Chrome  , 下载好后解压,加载已解压的程序的时候定位到WebContent 就可以了。


   



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值