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以外のプロジェクトでは、次のように依存を導入する必要があります.
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を構成configure()メソッドを使用して、これらの「認識できない」フィールドを無視します.
日付フォーマットの処理 getterで@JsonFormat注釈 を使用 ObjectMapperを呼び出すsetDateFormat()メソッド
フィールドフィルタJavaオブジェクトをJSONにシーケンス化する場合、パスワード、銀行カード番号などのフィルタリングが必要なフィールドがある場合があります.JSONには表示されません.Jacksonには比較的簡単な実装方法があります.@JsonIgnore単一フィールド をフィルタ@JsonIgnoreProperties複数のフィールド をフィルタ
カスタムシーケンス化と逆シーケンス化カスタムシーケンス化クラスは、StdSerializerを継承しながらserialize()メソッドを書き換え、JsonGeneratorを使用してJSONカスタム定義の逆シーケンス化クラスUserDeserializerを生成する必要があります.
カスタム逆シーケンス化クラスを定義した後、プログラムで呼び出すには、ObjectMapperのModuleに登録する必要があります.
まとめ
以上がジャックソンが普段よく使う方法で、日常開発のほとんどのシーンを解決することができます.
json解析器は多く、Gson、Jackson、fastJsonなど、Jacksonは優秀なjson解析器であり、springbootプロジェクトのデフォルトの解析器である.
メリット
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にシーケンス化し、異なるフォーマットで格納できる
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
ObjectMapperを構成configure()メソッドを使用して、これらの「認識できない」フィールドを無視します.
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
日付フォーマットの処理
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
public Date getCreateTime() {
return createTime;
}
mapper.setDateFormat(StdDateFormat.getDateTimeInstance());
フィールドフィルタJavaオブジェクトをJSONにシーケンス化する場合、パスワード、銀行カード番号などのフィルタリングが必要なフィールドがある場合があります.JSONには表示されません.Jacksonには比較的簡単な実装方法があります.
@JsonIgnore
public String getPassword() {
return password;
}
@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());
まとめ
以上がジャックソンが普段よく使う方法で、日常開発のほとんどのシーンを解決することができます.