Jackson学習ノート(一)Jackson解析Json

6839 ワード

ジャックソンを初めて知った
jarファイルをインポートするには:
jackson-annotations-2.9.9.jar
jackson-core-2.9.9.jar
jackson-databind-2.9.9.jar

一、Jacksonの紹介
1、Jackson
JacksonはJavaベースのアプリケーションライブラリで、JacksonはJavaオブジェクトを簡単にjsonオブジェクトとxmlドキュメントに変換することができ、json、xmlをJavaオブジェクトに変換することもできます.Jacksonが依存するjarパッケージは少なく、簡単で使いやすく、性能も比較的高く、Jacksonコミュニティは比較的活発で、更新速度も比較的速い.
Jacksonは、ストリーム処理jsonだけでなく、データバインディング(POJOとJSON間の相互変換)もサポートし、他のサードパーティ製ライブラリでサポートされているデータフォーマットも多く拡張しています.
2、Jacksonの三つのコアモジュール:
Jackson-core:JSON処理の詳細を含む低レベルのストリームAPIを定義します.
Jackson-annotations:Jacksonの注釈が含まれています.
Jackson-databind:オブジェクトとJSON間の変換が実現され、このパケットは上の2つのパケットに依存します.
3、JSONの解析方法:
JSONを分割して解析する方法はいくつかありますが、3つにまとめることができます.
  • 反復:Tokenストリームと呼ばれるイベントストリームの反復
  • データバインディング:Jsonデータをオブジェクトにバインディング
  • 遍歴ツリー:ツリー構造を構築し、適切な方法で遍歴
  • 4、対応するJavaのAPI:
  • SAXとStax.これは、イベントフローを巡回するためのいくつかの基本的なAPIを提供する.その中で、SAXは自発的にeventをあなたに押して(push)、Staxはあなたに自発的にこのイベントフロー(pull)を遍歴させることができます.1つはpush,1つはpullであるが,イベントフローはすべて同じであり,表現方式が異なるだけである.イベントcallbackのSAXを提供し、イベントのStaxをアクティブに巡回し、Stax Cursor API(カーソル)もあります.
  • JAXBはデータバインディングの標準である.n+1の代替品(Jibx,XMLBEans,Castorなど)がありますが、それらはすべてこのようにしています:(Java)オブジェクトをxmlに変換し、逆に、その中のいくつかは便利で有効で、他のいくつかはそうではありません.
  • DOMは「最も標準的な」APIであり、ツリー構造を定義する.しかし,データバインディングと同様に,(より良い)代替案(XOM,JDOM,DOM 4 j)はいくつかある.ノードごとに巡回することも、XPathを使用することもできます.

  • XMLばかりですが、JSONについて議論していますね!事実は証明して、フォーマットは重要ではありませんて、重要なのはこのような解析の思想です.
    5、Jacksonが提供した3つのクラスに対応しています.
  • コアパッケージ(jackson-core)には、イベントイベントイベントではなくトークンtokenと呼ばれるように反復トークンを許可するJsonParserおよびJsonGeneratorが含まれる.
  • ObjectMapperはデータバインディング機能を実現した:JSONとObject間の相互変換.
  • TreeMapperは、JSON文字列をツリー化したもので、ノード(JsonNode)とサブノード(JsonNode)が含まれています.

  • 二、Javaオブジェクト転Json(ObjectMapper.writeValue()
    POJO類:
    package main.java.StuJackson;
    
    public class Student {
        private String id;
        private String name;
        private String gender;
        private String phone;
    
        public Student() {}
    
        public Student(String id, String name, String gender, String phone) {
            this.id = id;
            this.name = name;
            this.gender = gender;
            this.phone = phone;
        }
    
        //  getter setter
    
        @Override
        public String toString() {
            return "Student{" +
                    "id='" + id + '\'' +
                    ", name='" + name + '\'' +
                    ", gender='" + gender + '\'' +
                    ", phone='" + phone + '\'' +
                    '}';
        }
    }
    

    jacksonで最も重要なクラスはObjectMapperであり、ドキュメント内のコメントは再利用可能であり、共有可能である.スレッドが安全なクラスであるべきです.機能は実体クラスがjsonになることとjsonを実体クラスに変えること、実体クラスがjsonになること、ObjectMapperオブジェクトはpublicのクラスメンバー変数またはgetメソッドのある変数のみをjson列に書く(setメソッドはなくてもよい).
    注意:
    POJOオブジェクトをjsonに変換すると、Jacksonはgetterメソッドを持つ属性やpublicと宣言されたフィールドのみをシーケンス化します.そうしないと、そのフィールドはシーケンス化されません.
    1.POJOをjson形式に変換する文字列
        @Test
        public void TestJOPO2Json1(){
            //  ObjectMapper
            ObjectMapper mapper = new ObjectMapper();
            Student student1 = new Student("001","Jack","Male","18765456543");
            try {
                //     json   
                String stringPOJOJson = mapper.writeValueAsString(student1);
                System.out.println(stringPOJOJson);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    2、POJOをjsonファイルに書き込む
        @Test
        public void TestJOPO2Json2(){
            //  ObjectMapper
            ObjectMapper mapper = new ObjectMapper();
            Student student1 = new Student("001","Jack","Male","18765456543");
            try {
                //     json  
                mapper.writeValue(new File("json/jack.json"),student1);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    3、集合オブジェクトをjsonファイルに書き込む
        @Test
        public void TestJOPO2Json3(){
            //  ObjectMapper
            ObjectMapper mapper = new ObjectMapper();
    
            Student student2 = new Student("002","Tom","Male","18765466643");
            Student student3 = new Student("003","JackSon","Male","18765477743");
            List students = new ArrayList<>();
            students.add(student2);
            students.add(student3);
    
            //       json  
            try {
                mapper.writeValue(new File("json/students.json"),students);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    Javaでの集合は,jsonで対応するデータ結果が配列であり,もちろんJavaでの配列もJsonでの配列に対応する.
    三、Json回転Javaオブジェクト(ObjectMapper.readValue()
    受信タイプとjsonファイルのタイプが一致しない場合、入力不一致異常が発生し、オブジェクトのインスタンスが逆シーケンス化できないことを示します.
    com.fasterxml.jackson.databind.exc.MismatchedInputException: 
    Cannot deserialize instance of `main.StuJackson.TestPOJO2Json.Student` out of START_ARRAY token

    注意:
    jsonのオブジェクトのフィールドタイプとPOJOのタイプが一致しないか、POJOのフィールド数より多い場合は、逆シーケンス化に成功しません.フィールドがgetterメソッドとsetterメソッドのいずれかを所有しているか、またはフィールドが公開タイプであることを保証します.このフィールドは逆シーケンス化に成功します.
    1.json形式のString文字列をPOJOオブジェクトに変換する
        @Test
        public void TestJson2JOPO1(){
            //Json    POJO
            ObjectMapper mapper = new ObjectMapper();
            String JackJson = "{\"id\":\"001\",\"name\":\"Jack\",\"gender\":\"Male\",\"phone\":\"18765456543\"}";
            try {
                Student Jack = mapper.readValue(JackJson,Student.class);
                System.out.println(Jack.toString());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    2、jsonファイルをPOJO対象にする
        @Test
        public void TestJson2JOPO2(){
            //Json   POJO
            ObjectMapper mapper = new ObjectMapper();
            try {
                Student Jack = mapper.readValue(new File("json/jack.json"),Student.class);
                System.out.println(Jack.toString());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    3、配列タイプのjsonファイルをListセットにする
    注意:
    TypeReference,このクラスはcom.fasterxml.jackson.core.type.TypeReferenceパッケージで、パッケージを間違えないでください.
        @Test
        public void TestJson2JOPO3(){
            //Json     List  
            ObjectMapper mapper = new ObjectMapper();
            try {
                List students = mapper.readValue(new File("json/students.json"), new TypeReference>(){});
                for (Student student : students) {
                    System.out.println(student.toString());
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }