FastJson在Java后端方面解析使用(二)

简介: FastJson在Java后端方面解析使用(二)

一  FastJSON简短介绍


JSON协议使用方便,越来越流行,JSON的处理器有很多,这里我介绍一下


FastJson,FastJson是阿里的开源框架,被不少企业使用,是一个极其优秀的Json框架。


FastJson的特点:


1.FastJson数度快,无论序列化和反序列化,都是当之无愧的fast

2.功能强大(支持普通JDK类包括任意Java Bean Class、Collection、Map、Date或enum)

3.零依赖(没有依赖其它任何类库)


首先要下载fastjson的jar包。github地址: https://github.com/alibaba/fastjson


这里只牵扯到后端方面,用Junit4框架进行测试


二   FastJSON三个类的简单介绍


FastJSON包中有三个常用的对象,JSON,JSONObject,JSONArray三个对象。


二.一 JSON类


public abstract class JSON  implements JSONStreamAware, JSONAware{
}


JSON类实现了JSONStreamAware和JSONAware接口。


JSONAware接口:


package com.alibaba.fastjson;
public abstract interface JSONAware
{
  //转换成JSON类型的字符串
  public abstract String toJSONString();
}


JSONStreamAware接口:


public abstract interface JSONStreamAware   //JSON+流+Aware 能力  
{
  // 向里面写Appendable, 追加。  转换成JSON字符串
  public abstract void writeJSONString(Appendable paramAppendable)
    throws IOException;
}


Appendable接口:


public interface Appendable {
//添加字符串
     Appendable append(CharSequence csq) throws IOException;
//添加的字符串,可以截取  start,end
    Appendable append(CharSequence csq, int start, int end) throws IOException;
//添加单个字符
    Appendable append(char c) throws IOException;
}


二.二  JSONObject 类


public class JSONObject  extends JSON
  implements Map<String, Object>, Cloneable, Serializable, InvocationHandler{
}


JSONObject类继承了JSON类,实现了Map接口,Cloneable(克隆接口),序列化(Serializable),InvocationHandler(调用处理器)

InvocationHandler.java


public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable;


默认值为16。


所以JSONObject主要存储的方式是以Map<Key,Value>的形式进行相应的存储。存储的是单值形式。


构造方法:


public JSONObject(Map<String, Object> map) {
       this.map = map;
   }


二.三  JSONArray类


public class JSONArray  extends JSON
 implements List<Object>, Cloneable, RandomAccess, Serializable{}


JSONArray类也继承了JSON类, 实现了List<Object>接口,Cloneable克隆接口,Serializable 序列化接口,RandomAccess接口。


public interface RandomAccess {
}


实现了List接口,是以数组的形式进行相应的存储。


构造方法:


 public JSONArray(List<Object> list) {
          this.list = list;
   }


JSONObject和JSONArray均实现了JSON类,故一般都是用子类,即单值用JSONObject,集合用JSONArray。


三   JSONObject类的具体使用


三.一  转换成普通字符串格式


转换的格式为:   var obj={"name":"两个蝴蝶飞","age":24,"sex":"男"};


代码为:


        /**
   * 一个普通的字符串格式.
   * var obj={"name":"两个蝴蝶飞","age":24,"sex":"男"};
   * 用JSONObject进行添加.
   */
  @Test
  public void testString1(){
    //空构造
    JSONObject json=new JSONObject();
    //内部使用的是map结构,put放置值
    json.put("id",1);
    json.put("name","两个蝴蝶飞");
    json.put("age",24);
    json.put("sex","男");
    //转换成json字符串. toJSONString()
    String result=json.toJSONString();
    System.out.println(result);
  }


20180916152412388.png


是字符串格式。


三.二  将JSON字符串进行解析取值


        @Test
  /*
   * 解析JSON字符串
   * {"name":"两个蝴蝶飞","age":24,"sex":"男"};
   */
  public void testToString1(){
    String source="{'name':'两个蝴蝶飞','age':24,'sex':'男'}";
    //利用静态方法parseObject(source),将要解析的资源放进去
    JSONObject json=JSON.parseObject(source);
    //取得数据时  可以取得具体的类型
    System.out.println(json.getIntValue("age"));
    System.out.println(json.getString("sex"));
    System.out.println(json.getString("name"));
  }


20180916153106918.png


三.三  利用Map显式放置值


        @Test
  /**
   * 前面带一个前缀. 用添加Map
   * {"person":{"name":"两个蝴蝶飞","age":24,"sex":"男"}}
   */
  public void testString2(){
    Map<String,Object> map=new HashMap<String,Object>();
    map.put("name","岳建立");
    map.put("age",24);
    map.put("sex","男");
    JSONObject json=new JSONObject();
    json.put("person",map);
    String result=json.toJSONString();
    System.out.println(result);
    //如果不要前缀,可以直接 {"name":"两个蝴蝶飞","age":24,"sex":"男"}
    //System.out.println(JSON.toJSONString(map));
  }


20180916153740190.png


三.四  取出Map中的值


@Test
  public void testToString2(){
    String source="{\"person\":{\"sex\":\"男\",\"name\":\"岳建立\",\"age\":24}}";
    JSONObject json=JSON.parseObject(source);
    System.out.println(json.getString("person"));
    // {"name":"两个蝴蝶飞","age":24,"sex":"男"}
    //继续取出
    JSONObject json2=JSON.parseObject(json.getString("person"));
    System.out.println(json2.getString("name"));
    System.out.println(json2.getString("sex"));
    System.out.println(json2.getIntValue("age"));
  }


20180916154131884.png


四   JSONArray的使用


如果属性过多的话,那么就需要用一个User类进行相应的封装了。即开始引入对象了。

引入相应的User的类


package com.fastjson.pojo;
/**
  *author 作者 两个蝴蝶飞
  *version 创建时间 2018年9月16日下午3:42:37 
*/
public class User {
  private int id;
  private String name;
  private int age;
  private String sex;
  private String content;
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  public String getSex() {
    return sex;
  }
  public void setSex(String sex) {
    this.sex = sex;
  }
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getContent() {
    return content;
  }
  public void setContent(String content) {
    this.content = content;
  }
  @Override
  public String toString() {
    return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
  }
}


四.一  JSONArray 配置单个JavaBean类


1. 前缀没有用key值:


@Test
  /**
   * 将一个单对象转换成JSON格式
   * {"age":24,"content":"一个小小的程序员","id":1,"name":"两个蝴蝶飞","sex":"男"}
   */
  public void testUser1(){
    User user=new User();
    user.setId(1);
    user.setName("两个蝴蝶飞");
    user.setSex("男");
    user.setAge(24);
    user.setContent("一个小小的程序员");
                //直接用JSON.toJSONString(); toJSONString(user)
    String result=JSON.toJSONString(user);
    System.out.println(result);
  }


20180916155003561.png


2. 前缀有key值


 @Test       
public void testUser1(){
    User user=new User();
    user.setId(1);
    user.setName("两个蝴蝶飞");
    user.setSex("男");
    user.setAge(24);
    user.setContent("一个小小的程序员");
    //用JSONObject
    JSONObject json=new JSONObject();
    json.put("user",user);
    String result=json.toJSONString();
    System.out.println(result);
  }


20180916155240818.png


3. 取出没有key值的Java Bean


        @Test
  public void testToUser4(){
    String source="{\"age\":24,\"content\":\"一个小小的程序员\",\"id\":1,\"name\":\"两个蝴蝶飞\",\"sex\":\"男\"}";
    //直接转换成对象
    User user1=JSON.parseObject(source,User.class);
    System.out.println(user1);
  }


20180916155733690.png


4. 取出有key值的的Java Bean


  @Test
  public void testToUser1(){
    String source="{\"user\":{\"age\":24,\"content\":\"一个小小的程序员\",\"id\":1,\"name\":\"两个蝴蝶飞\",\"sex\":\"男\"}}";
    //直接转换成对象
    //先取出后面的值
    String result=JSON.parseObject(source).getString("user");
//继承转换
    User user1=JSON.parseObject(result,User.class);
    System.out.println(user1);
  }


20180916155733690 (1).png


四.二  JSONArray 配置List 集合


      @Test
  //将一个对象数组集合添加到JSON中,用JSONArray
  /*
   {"persons":[{"age":0,"content":"小小的程序员而已0","id":0,"name":"两个蝴蝶飞0","sex":"男"},
   {"age":0,"content":"小小的程序员而已1","id":1,"name":"两个蝴蝶飞1","sex":"女"},
   {"age":0,"content":"小小的程序员而已2","id":2,"name":"两个蝴蝶飞2","sex":"男"}]}
   */
  public void testUser2(){
    List<User> users = new ArrayList<User>();  
    for (int i = 0; i < 3; i++) {  
        User u = new User();  
        u.setId((i));
        u.setName("两个蝴蝶飞"+i);
        u.setContent("小小的程序员而已"+i);
        u.setSex(i % 2 == 0 ? "男" : "女");  
        users.add(u);  
    }
    //String result=JSON.toJSONString(users);
    JSONObject json=new JSONObject();
    json.put("persons",users);
    String result=json.toJSONString();
    System.out.println(result);
  }


解析List集合


@Test
  public void testToUser2(){
    String resource="{\"list\":[{\"id\":0,\"name\":\"两个蝴蝶飞0\",\"sex\":\"男\"} {\"id\":1,\"name\":\"两个蝴蝶飞1\",\"sex\":\"女\"},{\"id\":2,\"name\":\"两个蝴蝶飞2\",\"sex\":\"男\"}]}";
    String text=JSON.parseObject(resource).getString("list");
    //现在,这已经是一个数组了.如何将数组进行解析呢? 用JSONArray
    JSONArray arrays=JSON.parseArray(text);
    List<User> allList=new ArrayList<User>();
    for(int i=0;i<arrays.size();i++){
      //用toJavaObject toJavaObject
      User u=JSON.toJavaObject(arrays.getJSONObject(i),User.class);
      allList.add(u);
    }
    for (User user : allList) {
      System.out.println(user.getId()+","+user.getName());
    }
  }


20180916161927982.png



这是常用的几种解析方式。谢谢


解析成功,谢谢!!!

相关文章
|
1天前
|
存储 缓存 算法
滚雪球学Java(62):HashSet的底层实现原理解析
【6月更文挑战第16天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
8 3
滚雪球学Java(62):HashSet的底层实现原理解析
|
2天前
|
Java 开发者 UED
Java中的异常处理机制深度解析
在Java编程中,异常处理是确保软件健壮性的关键因素。本文将深入探讨Java的异常处理机制,包括异常的类型、如何捕获和处理异常,以及最佳实践。我们将通过实例学习如何优雅地处理异常,避免常见的陷阱,并提升代码的可维护性和用户体验。
|
3天前
|
搜索推荐 Java 程序员
【案例解析】从菜鸟到高手,如何优雅地使用Java条件语句?
【6月更文挑战第14天】本文介绍了Java编程中条件语句的重要性,特别是if-else和switch的使用。通过四个案例,展示了如何优雅地运用这些语句:案例一演示了基础if-else用于用户登录响应;案例二利用switch处理枚举类型,如订单状态;案例三展示了条件语句的嵌套与组合,用于游戏评分系统;案例四探讨了代码优化与重构,减少冗长的if-else结构。文章强调,掌握条件语句能提升编码效率和代码质量,鼓励开发者不断实践以写出高效优雅的代码。
|
3天前
|
Java 开发者
别再傻傻分不清!Java if-else与switch的性能对比全解析!
【6月更文挑战第14天】本文探讨了Java中if-else与switch语句的性能异同。虽然现代JVM的优化使得两者性能差异不大,但特定情况下仍有区别。switch通过跳转表提供高效执行,尤其适用于枚举和固定值,而if-else依赖条件顺序,JVM可能优化常量条件。实验显示,处理大量重复case时,switch性能更优。选择时还需考虑可读性和维护性,灵活运用以实现高效优雅的代码。
|
3天前
|
安全 Java API
深入解析 Java 8 新特性:LocalDate 的强大功能与实用技巧
深入解析 Java 8 新特性:LocalDate 的强大功能与实用技巧
9 1
|
3天前
|
缓存 NoSQL Java
Java高并发实战:利用线程池和Redis实现高效数据入库
Java高并发实战:利用线程池和Redis实现高效数据入库
17 0
|
5天前
|
安全 Java API
Java并发基础-启动和终止线程
Java并发基础-启动和终止线程
15 0
|
5天前
|
Java 调度
Java并发基础-线程简介(状态、常用方法)
Java并发基础-线程简介(状态、常用方法)
13 0
|
1天前
|
Java 调度
【Java基础】 线程状态转化
Java线程状态转化
13 2
|
3天前
|
监控 Java API
Java 程序设计 第八章 线程
Java 程序设计 第八章 线程

热门文章

最新文章

推荐镜像

更多