FastJson使用例(Java、Scal版)

11011 ワード

0.ディレクトリ
  • FastJson紹介
  • FastJsonの3つのコアクラス
  • Maven
  • Java API
  • 反プロローグ
  • 逆順序化単純Json文字列
  • 逆順序で簡単なJSON文字列をJavaオブジェクト群
  • とする。
  • 逆順序化された複雑なJSON文字列
  • プロローグ
  • プログレッシブおよびアンチプログレッシブ
  • JsonObjectのいくつかの操作
  • jsonArayのいくつかの操作
  • Scara API
  • 反プロローグ
  • demoログの内容
  • 逆序文化単純json文字列
  • アンチプログレッシブシンプルなjson文字列グループ
  • String処理
  • List処理
  • 1.FastJson概要
    JSONプロトコルは日常開発でよく使われています。前後端のデータインターフェース、ログフィールドの保存などを含めて、JSONプロトコルを採用しています。FastJsonはアリのオープンソースフレームで、とても使いやすいです。ここで簡単な使い方をまとめて、デモを作ります。Javaバージョン以外に、Sparkでもよくログを洗浄していますので、Scaraバージョンを配合しています。後で確認して使いやすいです。完全コードはGithubを参照できます。https://github.com/tygxy/BigData
    2.FastJsonの3つのコアクラス
  • JSON:fastjsonの解像度は、json文字列とjavaBean、Jsonオブジェクトの変換
  • に使用されます。
  • JSONObject:fastJsonが提供するjsonオブジェクト
  • JSONArray:fastJsonは、json配列オブジェクト
  • を提供する。
    3.Maven
        
            com.alibaba
            fastjson
            1.2.47
        
    
    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 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類、Techer類
  • をそれぞれ作成する。
    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 students;
    
        public Teacher(String teacherName, int age, Course course, List 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 getStudents() {
            return students;
        }
    
        public void setStudents(List 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 Json Objectのいくつかの操作
    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 JsonArayのいくつかの操作
    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.Scara API
    5.1アンチプログレッシブ
  • demoログの内容
  • data.log
  • {"name":"  ","age":10}
    {"name":"  ","age":11}
    {"name":"  "}
    {"age":11}
    
  • data 1.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文字列を解析することができます。これもいい方法が見つけられませんでした。読者の指導を歓迎します。
  • 方法1:文字列処理
  • 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)
    
  • 方法2:List
  • val dataRDD3 = jsonRDD2.flatMap(json => {
      val jsonArray = JSON.parseObject(json).getJSONArray("data")
      var dataList : List[String] = List()  //     List
      for (i  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.参考
  • 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