FastJson使用范例(Java、Scala版)
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 API4.1 反序列化
反序列化一个简单Json字符串
publicclassUser{privateStringname;privateintage;publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age=age;}}
StringjsonString="{\"name\":\"张三\",\"age\":50}";Useruser=JSON.parseObject(jsonString,User.class);System.out.println("name:"+user.getName()+"age:"+user.getAge());//输出结果name:张三age:50
反序列化操作
创建JavaBean的User类
反序列化一个简单JSON字符串成Java对象组
StringjsonArrayString="[{\"name\":\"张三\",\"age\":50},{\"name\":\"李四\",\"age\":51}]";List<User>userList=JSON.parseArray(jsonArrayString,User.class);Iteratorit=userList.iterator();while(it.hasNext()){Useru=(User)it.next();System.out.println("name:"+u.getName()+"age:"+u.getAge());}//输出结果name:张三age:50name:李四age:51
反序列化一个复杂的JSON字符串
publicclassCourse{privateStringcourseName;privateStringcode;publicCourse(StringcourseName,Stringcode){this.setCourseName(courseName);this.setCode(code);}publicStringgetCourseName(){returncourseName;}publicvoidsetCourseName(StringcourseName){this.courseName=courseName;}publicStringgetCode(){returncode;}publicvoidsetCode(Stringcode){this.code=code;}}publicclassStudent{privateintid;privateStringstudentName;privateintage;publicStudent(intid,StringstudentName,intage){this.setId(id);this.setStudentName(studentName);this.setAge(age);}publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;}publicStringgetStudentName(){returnstudentName;}publicvoidsetStudentName(StringstudentName){this.studentName=studentName;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age=age;}}publicclassTeacher{privateStringteacherName;privateintage;privateCoursecourse;privateList<Student>students;publicTeacher(StringteacherName,intage,Coursecourse,List<Student>students){this.setTeacherName(teacherName);this.setAge(age);this.setCourse(course);this.setStudents(students);}publicStringgetTeacherName(){returnteacherName;}publicvoidsetTeacherName(StringteacherName){this.teacherName=teacherName;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age=age;}publicCoursegetCourse(){returncourse;}publicvoidsetCourse(Coursecourse){this.course=course;}publicList<Student>getStudents(){returnstudents;}publicvoidsetStudents(List<Student>students){this.students=students;}}
StringcomplexJsonString="{\"teacherName\":\"crystall\",\"age\":27,\"course\":{\"courseName\":\"english\",\"code\":1270},\"students\":[{\"id\":1,\"studentName\":\"lily\",\"age\":12},{\"id\":2,\"studentName\":\"lucy\",\"age\":15}]}";Teacherteacher=JSON.parseObject(complexJsonString,Teacher.class);
反序列化操作
分别创建JavaBean的Course类、Student类、Teacher类
4.2 序列化序列化一个Java Bean对象
Useru=newUser();u.setName("王五");u.setAge(30);System.out.println(JSON.toJSONString(u));//输出结果{"age":30,"name":"王五"}Useru1=newUser();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 序列化和反序列日期
Datedate=newDate();StringdateString=JSON.toJSONStringWithDateFormat(date,"yyyy-MM-ddHH:mm:ss");System.out.println(dateString);//输出结果"2018-08-0309:44:21"StringdateString1="{\"time\":\"2018-08-0122:22:22\"}";System.out.println(JSON.parseObject(dateString1));//输出结果{"time":"2018-08-0122:22:22"}4.4 JsonObject的一些操作
StringjsonString1="{\"name\":\"张三\",\"age\":50}";JSONObjectjsonObject=JSON.parseObject(jsonString1);System.out.println(jsonObject.keySet());//输出key集合,输出结果[name,age]if(jsonObject.containsKey("sex")){//判断key是否存在,输出结果falseSystem.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是否存在,输出结果falseSystem.out.println(true);}else{System.out.println(false);}4.5 jsonArray的一些操作
StringjsonArrayString1="[{\"id\":1,\"studentName\":\"lily\",\"age\":12},{\"id\":2,\"studentName\":\"lucy\",\"age\":15}]";JSONArrayjsonArray=JSON.parseArray(jsonArrayString1);for(inti=0;i<jsonArray.size();i++){//遍历输出JSONObjectjsonObj=jsonArray.getJSONObject(i);System.out.println(jsonObj.get("id"));}Students3=newStudent(3,"学生乙",15);jsonArray.add(s3);//添加新jsonobject对象,输出结果3System.out.println(jsonArray.size());if(jsonArray.contains(s3)){//判断是否存在,输出结果trueSystem.out.println(true);}else{System.out.println(false);}5.Scala API5.1 反序列化
demo日志内容
{"name":"张三","age":10}{"name":"李四","age":11}{"name":"李四"}{"age":11}
{"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"}]}
data1.log
data.log
反序列化简单json字符串
valspark=SparkSession.builder().master("local[2]").appName("FastJsonTest").getOrCreate()valinput1="data.log"valjsonRDD1=spark.sparkContext.textFile(input1)valdataRDD1=jsonRDD1.map(json=>{valjsonObject=JSON.parseObject(json)valname=jsonObject.getOrDefault("name",null)valage=jsonObject.getOrDefault("age",null)(name,age)})dataRDD1.foreach(println)//输出结果(李四,null)(null,11)(张三,10)(李四,11)
反序列化简单json字符串组,实现一行变多行地解析json字符串。这个我也没找到很好的方法,欢迎读者指教一下
valinput2="data1.log"valjsonRDD2=spark.sparkContext.textFile(input2)valdataRDD2=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))valdata2=dataRDD2.map(jsonObject=>{valversion=jsonObject.getOrDefault("version",null)vallabel=jsonObject.getOrDefault("label",null)valacc=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)
valdataRDD3=jsonRDD2.flatMap(json=>{valjsonArray=JSON.parseObject(json).getJSONArray("data")vardataList:List[String]=List()//创建一个Listfor(i<-0tojsonArray.size()-1){dataList=jsonArray.get(i).toString::dataList}dataList}).map(x=>JSON.parseObject(x))valdata3=dataRDD3.map(jsonObject=>{valversion=jsonObject.getOrDefault("version",null)vallabel=jsonObject.getOrDefault("label",null)valacc=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)
方法二:List
方法一:字符串处理
5.2 序列化序列化一个简单java Bean对象
valarr=Seq("tom:10","bob:14","hurry:9")valdataRdd=spark.sparkContext.parallelize(arr)valdataString=dataRdd.map(x=>{valarr=x.split(":")valname=arr(0)valage=arr(1).toIntvalu=newUser(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.参考
https://segmentfault.com/a/1190000011212806
https://www.cnblogs.com/cdf-opensource-007/p/7106018.html
https://github.com/alibaba/fastjson
https://blog.csdn.net/universsky2015/article/details/77965563?locationNum=9&fps=1
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。