Jackson JSONシーケンス化逆シーケンス化

6592 ワード

ジャックソンって何?https://github.com/FasterXML/jackson
Jacksonは主に以下のパッケージから構成されています
1. Jackson Databind      ,     "    "       API ( ObjectMapper )  "   "       API (JsonNode);  "    "     API  "   "    API     "   "    API
2. Jackson Core    ,    "   "      API,    JsonPaser   JsonGenerator。 Jackson                 API   JsonGenerator   JsonParser        json
3. Jackson Annotations    ,        

Kotlinプラグイン--jackson-module-kotlinhttps://github.com/FasterXML/jackson-module-kotlin
このモジュールは、Kotlinクラスとデータクラスのシーケンス化/逆シーケンス化のサポートを追加します.Jacksonの追加モジュールは、Kotlin言語、特にメソッド/コンストラクション関数パラメータ名の自省をサポートするために使用され、明示的な属性名コメントを追加する必要はありません.このモジュールは、Kotlinクラスとデータクラスのシーケンス化/逆シーケンス化のサポートを追加します.以前は、Jacksonがオブジェクトに逆シーケンス化できるように、Kotlinオブジェクトにデフォルトのコンストラクション関数が存在する必要がありました.このモジュールを使用すると、単一のコンストラクション関数クラスを自動的に使用できます.また、補助コンストラクション関数または静的ファクトリを持つクラスもサポートされます.
クイックスタート->ObjectMapperdatabind.ObjectMapperはJacksonがシーケンス化と逆シーケンス化を提供する主なクラスであり、その継承関係はpublic class ObjectMapper extends ObjectCodec implements Versionedである.
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.SerializationFeature

data class User(val name: String = "Unknown", val age: Int = 0)

var mapper = ObjectMapper()

fun main(args: Array) {
    usage()
    mapper.enable(SerializationFeature.INDENT_OUTPUT) //     ,      
    usage()
}

fun usage() {
    var json = """{"name":"    "}"""
    val syokaku = mapper.readValue(json, User::class.java)
    println("     $json ->
$syokaku") val ryubi = User(" ", 38) json = mapper.writeValueAsString(ryubi) println(" $ryubi ->
$json") } /* {"name":" "} -> User(name= , age=0) User(name= , age=38) -> {"name":" ","age":38} {"name":" "} -> User(name= , age=0) User(name= , age=38) -> { "name" : " ", "age" : 38 } */

SerializationFeature DeserializationFeature
(逆)シーケンス化列挙は、Javaオブジェクトの(逆)シーケンス化方式に影響する簡単なオン/オフ機能を定義します.
ObjectMapper#enable(SerializationFeature.INDENT_OUTPUT)
   
ObjectMapper#configure(SerializationFeature.INDENT_OUTPUT, ture)

ObjectMapper#configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) //           Java       
ObjectMapper#configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false) //             yyyy-MM-dd'T'HH:mm:ss.SSSZ 
ObjectMapper#setSerializationInclusion(Include.NON_NULL); //          null     
ObjectMapper#setDefaultPropertyInclusion(Include.NON_DEFAULT); //           

SpringのObjectMapperを構成するにはどうすればいいですか?MappingJackson 2 HttpMessageConverterはgetterメソッドを提供しています
@Configuration
@EnableWebMvc
open class ServletConfig : WebMvcConfigurer {
    override fun configureContentNegotiation(configurer: ContentNegotiationConfigurer) {
        configurer.defaultContentType(MediaType.APPLICATION_JSON_UTF8)
    }

    override fun configureDefaultServletHandling(configurer: DefaultServletHandlerConfigurer) {
        global.log("Spring MVC  ")
        configurer.enable() // MVC               Servlet   
    }

    override fun configureMessageConverters(converters: MutableList>) {
        val stringmc = StringHttpMessageConverter(Charsets.UTF_8)
        stringmc.setWriteAcceptCharset(false)
        converters.add(stringmc)
        
        val jsonmc = MappingJackson2HttpMessageConverter()
        val mapper = jsonmc.getObjectMapper()
        mapper.configure(SerializationFeature.INDENT_OUTPUT, true)
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
        converters.add(jsonmc)
        global.log("       ")
    }
}

注釈
Jacksonは、Jacksonのデフォルト方式に従ってjavaオブジェクトをシーケンス化および逆シーケンス化し、実際の必要に応じてデフォルト方式を柔軟に調整するには、Jacksonの注釈を使用します.よく使われる注釈と使い方は以下の通りです.
@JsonProperty       ,                   。  :
@JsonProperty("birth_ date")
private Date birthDate;

@JsonFormat         ,                  。  :
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm")
public Date getBirthDate()

@JsonPropertyOrder     ,           json      ,   :
@JsonPropertyOrder({ "birth_Date", "name" })
public class Person

@JsonCreator          ,  @JsonProperty     ,          。   :
@JsonCreator
public Person(@JsonProperty("name")String name) {…}

@JsonAnySetter          ,                     map  
@JsonAnySetter
public void set(String key, Object value) {
map.put(key, value);
}

@JsonAnyGetter       ,           
public Map any() { return map; }

注意、Kotlinはどのように構造方法からFieldの注釈を指定するか
data class User(@field:JsonProperty("  ") var name: String = "Unknown", val age: Int = 0)

fun usage() {
    val user = mapper.readValue("""{"  ":"  "}""", User::class.java)
    println(user)
    println(mapper.writeValueAsString(user))
}

/*
User(name=  , age=0)
{
  "age" : 0,
  "  " : "  "
}
*/

属性の表示
データ・クラスのプロパティの場合:
  • この属性修飾子がpublicである場合、この属性はシーケンス化および逆シーケンス化することができる.
  • プロパティの修飾子がpublicではない場合、getterメソッドおよびsetterメソッドはpublicであり、このプロパティはシーケンス化および逆シーケンス化可能である.getterメソッドはシーケンス化に使用され、setterメソッドは逆シーケンス化に使用されるためです.
  • 属性がpublicのsetterメソッドのみで、publicのgetterメソッドがない場合、この属性は逆シーケンス化にのみ使用できます.

  • デフォルトの属性可視化のルールを変更するには、ObjectMapperのメソッドsetVisibilityを呼び出す必要があります.
    ObjectMapper#setVisibility(PropertyAccessor.FIELD, Visibility.ANY); 
    
    PropertyAccessor        ALL,CREATOR,FIELD,GETTER,IS_GETTER,NONE,SETTER
    Visibility        ANY,DEFAULT,NON_PRIVATE,NONE,PROTECTED_AND_PUBLIC,PUBLIC_ONLY

    属性フィルタ
    属性フィルタリングによってプライバシー属性を遮断することができ、属性フィルタリングには多くの実現方法がある.
  • 注記
  • //   getter     
    @JsonIgnore
    public int getAge() 
    
    //   class   
    @JsonIgnoreProperties(value = { "age","birth_date" }) 
    public class Person
  • addMixInメソッド注記方式@JsonIgnoreProperties?
  • SimpleBeanPropertyFilter方式?
  •  FilterProvider filterProvider = new SimpleFilterProvider().addFilter("myFilter", newFilter); 
     mapper.setFilterProvider(filterProvider).writeValueAsString(?);

    https://www.ibm.com/developerworks/cn/java/jackson-advanced-application/index.html