FastJson使用范例(Java、Scala版)

0.目录

  • FastJson简介
  • FastJson三个核心类
  • Maven
  • Java API
    • 反序列化
      • 反序列化一个简单Json字符串
      • 反序列化一个简单JSON字符串成Java对象组
      • 反序列化一个复杂的JSON字符串
    • 序列化
    • 序列化和反序列化日期
    • JsonObject的一些操作
    • jsonArray的一些操作
  • Scala API
    • 反序列化
      • demo日志内容
      • 反序列化简单json字符串
      • 反序列化简单json字符串组
        • String处理
        • List处理

1. FastJson简介

JSON协议在日常开发中很常用,包括前后端的数据接口,日志字段的保存等,通常都采用JSON协议。FastJson是阿里的开源框架,很好用,估计开发的同学都有使用过。这里做一个简单的用法总结,配一些demo。除了Java版本外,由于在Spark也经常清洗日志,所以配上了Scala版本,方便日后查询使用。完整代码可以参考Github:https://github.com/tygxy/BigData

2. FastJson三个核心类

  • JSON:fastjson的解析器,用于json字符串和javaBean、Json对象的转换
  • JSONObject:fastJson提供的json对象
  • JSONArray:fastJson提供json数组对象

3. Maven

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.47</version>
    </dependency>

4. Java API

4.1 反序列化

  • 反序列化一个简单Json字符串

    • 创建JavaBean的User类
    public class User {
        private String name;
        private int age;
    
        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;
        }
    }
    
    • 反序列化操作
    String jsonString = "{\"name\":\"张三\",\"age\":50}";
    User user= JSON.parseObject(jsonString,User.class);
    System.out.println("name:"+user.getName()+" age:"+user.getAge());
    
    // 输出结果 name:张三 age:50
    
  • 反序列化一个简单JSON字符串成Java对象组

String jsonArrayString = "[{\"name\":\"张三\",\"age\":50},{\"name\":\"李四\",\"age\":51}]";
List<User> userList = JSON.parseArray(jsonArrayString,User.class);
Iterator it = userList.iterator();
while (it.hasNext()) {
    User u = (User)it.next();
    System.out.println("name:"+u.getName()+" age:"+u.getAge());
}

// 输出结果  name:张三 age:50
            name:李四 age:51
  • 反序列化一个复杂的JSON字符串
    • 分别创建JavaBean的Course类、Student类、Teacher类
    public class Course {
        private String courseName;
        private String code;
    
        public Course (String courseName, String code){
            this.setCourseName(courseName);
            this.setCode(code);
        }
    
        public String getCourseName() {
            return courseName;
        }
    
        public void setCourseName(String courseName) {
            this.courseName = courseName;
        }
    
        public String getCode() {
            return code;
        }
    
        public void setCode(String code) {
            this.code = code;
        }
    }
    
    public class Student {
        private int id;
        private String studentName;
        private int age;
    
        public Student(int id, String studentName, int age) {
            this.setId(id);
            this.setStudentName(studentName);
            this.setAge(age);
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getStudentName() {
            return studentName;
        }
    
        public void setStudentName(String studentName) {
            this.studentName = studentName;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    
    public class Teacher {
        private String teacherName;
        private int age;
        private Course course;
        private List<Student> students;
    
        public Teacher(String teacherName, int age, Course course, List<Student> students) {
            this.setTeacherName(teacherName);
            this.setAge(age);
            this.setCourse(course);
            this.setStudents(students);
        }
    
        public String getTeacherName() {
            return teacherName;
        }
    
        public void setTeacherName(String teacherName) {
            this.teacherName = teacherName;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public Course getCourse() {
            return course;
        }
    
        public void setCourse(Course course) {
            this.course = course;
        }
    
        public List<Student> getStudents() {
            return students;
        }
    
        public void setStudents(List<Student> students) {
            this.students = students;
        }
    }
    
    • 反序列化操作
    String complexJsonString = "{\"teacherName\":\"crystall\",\"age\":27,\"course\":{\"courseName\":\"english\",\"code\":1270},\"students\":[{\"id\":1,\"studentName\":\"lily\",\"age\":12},{\"id\":2,\"studentName\":\"lucy\",\"age\":15}]}";
    Teacher teacher = JSON.parseObject(complexJsonString,Teacher.class);
    

4.2 序列化

  • 序列化一个Java Bean对象
User u = new User();
u.setName("王五");
u.setAge(30);
System.out.println(JSON.toJSONString(u));

// 输出结果 {"age":30,"name":"王五"}

User u1 = new User();
u1.setAge(30);
System.out.println(JSON.toJSONString(u1,SerializerFeature.WriteMapNullValue)); // 输出null,输出结果 {"age":30,"name":null}
System.out.println(JSON.toJSONString(u1,SerializerFeature.WriteNullStringAsEmpty)); // 输出"",输出结果 {"age":30,"name":""}

4.3 序列化和反序列日期

Date date = new Date();

String dateString = JSON.toJSONStringWithDateFormat(date, "yyyy-MM-dd HH:mm:ss");
System.out.println(dateString);

// 输出结果 "2018-08-03 09:44:21"

String dateString1 = "{\"time\":\"2018-08-01 22:22:22\"}";
System.out.println(JSON.parseObject(dateString1));

// 输出结果 {"time":"2018-08-01 22:22:22"}

4.4 JsonObject的一些操作

String jsonString1 = "{\"name\":\"张三\",\"age\":50}";
JSONObject jsonObject = JSON.parseObject(jsonString1);

System.out.println(jsonObject.keySet()); // 输出key集合,输出结果 [name, age]

if(jsonObject.containsKey("sex")) { // 判断key是否存在,输出结果 false
    System.out.println(true);
} else {
    System.out.println(false);
}

jsonObject.put("sex","man"); // 添加k/v键值对,输出结果 {"sex":"man","name":"张三","age":50}
System.out.println(jsonObject);

if (jsonObject.containsValue("man")) { // 判断value是否存在,输出结果 false
    System.out.println(true);
} else {
    System.out.println(false);
}

4.5 jsonArray的一些操作

String jsonArrayString1 = "[{\"id\":1,\"studentName\":\"lily\",\"age\":12},{\"id\":2,\"studentName\":\"lucy\",\"age\":15}]";
JSONArray jsonArray = JSON.parseArray(jsonArrayString1);

for (int i = 0; i < jsonArray.size(); i++) { // 遍历输出
    JSONObject jsonObj= jsonArray.getJSONObject(i);
    System.out.println(jsonObj.get("id"));
}

Student s3 = new Student(3,"学生乙",15);
jsonArray.add(s3); // 添加新jsonobject对象,输出结果 3
System.out.println(jsonArray.size());

if(jsonArray.contains(s3)) { // 判断是否存在,输出结果 true
    System.out.println(true);
} else {
    System.out.println(false);
}

5.Scala API

5.1 反序列化

  • demo日志内容

    • data.log
    {"name":"张三","age":10}
    {"name":"李四","age":11}
    {"name":"李四"}
    {"age":11}
    
    • data1.log
    {"data":[{"label":"123","acc":1,"version":"4.3.1"}]}
    {"data":[{"label":"789","acc":1,"version":"4.3.1"},{"label":"78","acc":100,"version":"4.3.1"}]}
    {"data":[{"label":"5356","acc":1,"version":"4.3.1"}]}
    
  • 反序列化简单json字符串

val spark = SparkSession.builder().master("local[2]").appName("FastJsonTest").getOrCreate() 
val input1 = "data.log"

val jsonRDD1 = spark.sparkContext.textFile(input1)

val dataRDD1 = jsonRDD1.map(json => {
  val jsonObject = JSON.parseObject(json)
  val name = jsonObject.getOrDefault("name",null)
  val age = jsonObject.getOrDefault("age",null)
  (name,age)
})

dataRDD1.foreach(println)

// 输出结果 
(李四,null)
(null,11)
(张三,10)
(李四,11)
  • 反序列化简单json字符串组,实现一行变多行地解析json字符串。这个我也没找到很好的方法,欢迎读者指教一下
    • 方法一:字符串处理
    val input2 = "data1.log"
    val jsonRDD2 = spark.sparkContext.textFile(input2)
    
    val dataRDD2 = jsonRDD2.map(json => {
      JSON.parseObject(json).getJSONArray("data").toString
    }).map(x => x.substring(1,x.length-1).replace("},{","}---{"))  // 去掉字符串中的[],并替换},{成}---{,目的是用于区分
      .flatMap(x => x.split("---"))  // 字符串按----拆分
      .map(x => JSON.parseObject(x))
    
    val data2 = dataRDD2.map(jsonObject => {
      val version = jsonObject.getOrDefault("version",null)
      val label = jsonObject.getOrDefault("label",null)
      val acc = jsonObject.getOrDefault("acc",null)
      (version,label,acc)
    })
    
    data2.foreach(println)
    
    // 输出结果
    (4.3.1,5356,1)
    (4.3.1,123,1)
    (4.3.1,789,1)
    (4.3.1,78,100)
    
    • 方法二:List
    val dataRDD3 = jsonRDD2.flatMap(json => {
      val jsonArray = JSON.parseObject(json).getJSONArray("data")
      var dataList : List[String] = List()  // 创建一个List
      for (i <- 0 to jsonArray.size()-1) {
        dataList = jsonArray.get(i).toString :: dataList
      }
      dataList
    }).map(x => JSON.parseObject(x))
    
    val data3 = dataRDD3.map(jsonObject => {
      val version = jsonObject.getOrDefault("version",null)
      val label = jsonObject.getOrDefault("label",null)
      val acc = jsonObject.getOrDefault("acc",null)
      (version,label,acc)
    })
    
    data3.foreach(println)
    
    // 输出结果
    (4.3.1,5356,1)
    (4.3.1,123,1)
    (4.3.1,789,1)
    (4.3.1,78,100)
    

5.2 序列化

  • 序列化一个简单java Bean对象
val arr = Seq("tom:10", "bob:14", "hurry:9")
val dataRdd = spark.sparkContext.parallelize(arr)

val dataString = dataRdd.map(x => {
  val arr = x.split(":")
  val name = arr(0)
  val age = arr(1).toInt
  val u = new User(name,age)
  u
}).map(x => {
  JSON.toJSONString(x,SerializerFeature.WriteMapNullValue)  // 这里需要显示SerializerFeature中的某一个,否则会报同时匹配两个方法的错误
})

dataString.foreach(println)

// 输出结果
{"age":10,"name":"tom"}
{"age":14,"name":"bob"}
{"age":9,"name":"hurry"}

6.参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355

推荐阅读更多精彩内容