Jackson、強力なjava json解析器、json文字列、オブジェクトbean、map、配列listの相互変換を便利にする

5977 ワード

概要
json解析器は多く、Gson、Jackson、fastJsonなど、Jacksonは優秀なjson解析器であり、springbootプロジェクトのデフォルトの解析器である.
メリット
  • 大きなファイルを解析する速度は比較的速い.
  • 運転時に消費されるメモリは比較的少なく、性能がより良い.
  • APIは柔軟で、拡張とカスタマイズが容易な
  • Jacksonのコアモジュールは3つの部分から構成されています.
  • jackson-coreは、「ストリームモード」解析に基づく関連APIを提供するコアパッケージであり、JsonPaserおよびJsonGeneratorを含む.
  • jackson-annotations、注釈パッケージ、標準的な注釈機能を提供する.
  • jackson-databind、データバインディングパッケージ、「オブジェクトバインディング」解析に基づく相関API(ObjectMapper)および「ツリーモデル」解析に基づく相関API(JsonNode)
  • を提供する
    Springboot以外のプロジェクトでは、次のように依存を導入する必要があります.
    
        com.fasterxml.jackson.core
        jackson-databind
        2.11.2
    
    

    jackson-databindはjackson-coreとjackson-annotationsに依存するため、jackson-databindを追加すると、Mavenはjackson-coreとjackson-annotationsを自動的にプロジェクトに導入します.
    ObjectMapperの使用
    Jacksonで最もよく使われるAPIは、「オブジェクトバインド」に基づくObjectMapper ObjectMapperがwriteValueのシリーズメソッドでJavaオブジェクトをJSONにシーケンス化し、異なるフォーマットで格納できる
  • writeValueAsString(Object value)メソッドは、オブジェクトを文字列
  • として格納する.
  • writeValueAsBytes(Object value)メソッドは、オブジェクトをバイト配列
  • に格納する.
  • writeValue(File resultFile,Object value)メソッドは、オブジェクトをファイルに格納します.ObjectMapperは、readValueのシリーズメソッドを使用して、JSONを異なるデータソースからJavaオブジェクトに逆シーケンス化します.
  • readValue(String content,Class valueType)メソッドは文字列をJavaオブジェクト
  • に逆シーケンス化する.
  • readValue(byte[]src,Class valueType)メソッドはバイト配列をJavaオブジェクト
  • に逆シーケンス化する.
  • readValue(File src,Class valueType)メソッドファイルをJavaオブジェクトに逆シーケンス化する
  • ObjectMapper mapper = new ObjectMapper();
    
    //   json   
    User user=new User("singleZhang", 18);
    String userJson=mapper.writeValueAsString(user);
    
    //Map json   
    Map map=new HashMap();  
    String json=mapper.writeValueAsString(map);
    
    //  list json   
    User[] userArr = {user1, user2};  
    String jsonFromArr =  mapper.writeValueAsString(userArr);
    
    // json      
    String jsonStr= "{\"name\":\"singleZhang\"}";
    User user = mapper.readValue(jsonStr, User.class);
    
    //json    Map
    String jsonStr= "{\"name\":\"singleZhang\"}";
    Map userMap = mapper.readValue(jsonStr, Map.class);
    
    //json        List
    String jsonStr="[{\"name\":\"singleZhang1\",\"age\":\"17\"},{\"name\":\"singleZhang2\",\"age\":\"18\"}]";
    CollectionType listType = mapper.getTypeFactory().constructCollectionType(ArrayList.class, User.class);
    List userList = mapper.readValue(jsonStr, listType);
    
    // json    Map  List>
    String jsonStr="[{\"name\":\"singleZhang1\",\"age\":\"17\"},{\"name\":\"singleZhang2\",\"age\":\"18\"}]";
    CollectionType listType = mapper.getTypeFactory().constructCollectionType(ArrayList.class, Map.class);
    List> userMapList = mapper.readValue(jsonStr, listType);
    //      TypeReference    json        List
    String jsonStr="[{\"name\":\"singleZhang1\",\"age\":\"17\"},{\"name\":\"singleZhang2\",\"age\":\"18\"}]";
     List userList = mapper.readValue(jsonStr, new TypeReference>(){});
    
    
    //List   bean   map
    List> mapList=new ArrayList>();
    List beanList = userDao.selectAll();
    ObjectMapper mapper = new ObjectMapper();
    mapList = mapper.convertValue(beanList,new TypeReference>>(){});
    

    ObjectMapperを構成configure()メソッドを使用して、これらの「認識できない」フィールドを無視します.
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    

    日付フォーマットの処理
  • getterで@JsonFormat注釈
  • を使用
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    public Date getCreateTime() {
        return createTime;
    }
    
  • ObjectMapperを呼び出すsetDateFormat()メソッド
  • mapper.setDateFormat(StdDateFormat.getDateTimeInstance());
    

    フィールドフィルタJavaオブジェクトをJSONにシーケンス化する場合、パスワード、銀行カード番号などのフィルタリングが必要なフィールドがある場合があります.JSONには表示されません.Jacksonには比較的簡単な実装方法があります.
  • @JsonIgnore単一フィールド
  • をフィルタ
    @JsonIgnore
    public String getPassword() {
        return password;
    }
    
  • @JsonIgnoreProperties複数のフィールド
  • をフィルタ
    @JsonIgnoreProperties(value = { "password","cardId" })
    class User{
        private String name;
        private String password;
        private String cardId;
    }
    

    カスタムシーケンス化と逆シーケンス化カスタムシーケンス化クラスは、StdSerializerを継承しながらserialize()メソッドを書き換え、JsonGeneratorを使用してJSONカスタム定義の逆シーケンス化クラスUserDeserializerを生成する必要があります.
    public class UserDeserializer extends StdDeserializer {
        protected UserDeserializer(Class> var1) {
            super(var1);
        }
    
        public UserDeserializer() {
            this(null);
        }
    
        @Override
        public User deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
            JsonNode node = p.getCodec().readTree(p);
            User user = new User();
            int age = (Integer) ((IntNode) node.get("age")).numberValue();
            String name = node.get("name").asText();
            user.setAge(age);
            user.setName(name);
            return user;
        }
    }
    

    カスタム逆シーケンス化クラスを定義した後、プログラムで呼び出すには、ObjectMapperのModuleに登録する必要があります.
            ObjectMapper mapper = new ObjectMapper();
            SimpleModule module = new SimpleModule("UserDeserializer", new Version(1, 0, 0, null, null, null));
            module.addDeserializer(User.class, new UserDeserializer());
            mapper.registerModule(module);
            String json = "{ \"name\" : \"singleZhang\", \"age\" : 18 }";
            User user = mapper.readValue(json, User.class);
            System.out.println(user.toString());
    

    まとめ
    以上がジャックソンが普段よく使う方法で、日常開発のほとんどのシーンを解決することができます.