当前位置:网站首页>实用小工具: Kotlin 代码片段
实用小工具: Kotlin 代码片段
2022-07-27 05:01:00 【圆师傅】
1.将任意对象转换成Map
inline fun <reified T : Any> T.asMap() : Map<String, Any?> {
val props = T::class.memberProperties.associateBy {
it.name }
return props.keys.associateWith {
props[it]?.get(this) }
}
2. 实用ObjectMapper转换对象
2.1 对象转JsonString
data class Person(val name: String, var age: Int)
fun obj2JsonString(obj: Person){
val objectMapper = ObjectMapper().registerModule(JavaTimeModule()).disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS)
return objectMapper.writeValueAsString(person)
}
2.2 JsonString转对象
data class Person(val name: String = " ", var age: Int = 23)
fun getPersonFromJsonString(): Person {
val objectMapper = ObjectMapper().registerModule(JavaTimeModule()).disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS)
val jsonString = "{\"name\":\"tom\",\"age\":34}"
return objectMapper.readValue(jsonString, Person::class.java)
}
注意:
可以看到,这里的data class的每个字段都给了默认值得,如果不给,会报错:
Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.example.Person` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (String)"{"name":"tom","age":34}"; line: 1, column: 2]
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1615)
at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:400)
at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1077)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1332)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:331)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:164)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4524)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3466)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3434)
这是因为缺少一个无参的构造函数,而data class没有生成无参构造函数,需要为每个参数添加默认值,以产生无参构造函数。kotlin官网上有
给每个data class的每个属性都添加默认值,这多烦人的一件事!你想每个都写吗?反正我不想。
好在,kotlin官方还是有解决的:
使用no-arg的编译插件,在pom文件里作如下配置:
<plugin>
<artifactId>kotlin-maven-plugin</artifactId>
<groupId>org.jetbrains.kotlin</groupId>
<version>${kotlin.version}</version>
<configuration>
<compilerPlugins>
<!-- Or "jpa" for JPA support -->
<plugin>no-arg</plugin>
</compilerPlugins>
<pluginOptions>
<option>no-arg:annotation=com.my.Annotation</option>
<!-- Call instance initializers in the synthetic constructor -->
<!-- <option>no-arg:invokeInitializers=true</option> -->
</pluginOptions>
</configuration>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-noarg</artifactId>
<version>${kotlin.version}</version>
</dependency>
</dependencies>
</plugin>
2.3 JsonString中包含list
如果json字符串中包含了list,那么就应该写成:
data class Person(val name: String = " ", var age: Int = 23)
fun getPersonFromJsonString(): List<*> {
val objectMapper = ObjectMapper().registerModule(JavaTimeModule()).disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS)
val jsonString = "[{\"name\":\"tom\",\"age\":34},{\"name\":\"tom\",\"age\":34}]"
return objectMapper.readValue(jsonString, List::class.java)}
但是这样得到的list中,list中的元素并没有识别出来,而是以linkedHashMap的形式存储在list中的。如果我想取出具体的对象类型,应该这样:
data class Person(val name: String = " ", var age: Int = 23)
fun getPersonFromJsonString(): List<*> {
val objectMapper = ObjectMapper().registerModule(JavaTimeModule()).disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS)
val jsonString = "[{\"name\":\"tom\",\"age\":34},{\"name\":\"tom\",\"age\":34}]"
var people: List<Person> = objectMapper.readValue(jsonString, objectMapper.typeFactory.constructCollectionType(List::class.java, Person::class.java))
return people
这样就可以得到list中包含的具体实例了。
边栏推荐
- Use of file i/o in C
- 34. 分析flexible.js
- JVM上篇:内存与垃圾回收篇--运行时数据区四-程序计数器
- 34. Analyze flexible.js
- Standard dialog qmessagebox
- JVM Part 1: memory and garbage collection part 14 -- garbage collector
- Solution to Dlib installation failure
- 《Robust and Precise Vehicle Localization based on Multi-sensor Fusionin Diverse City Scenes》翻译
- 辗转相除法
- Dialog introduction
猜你喜欢
随机推荐
精选用户故事|洞态在聚水潭的误报率几乎为0,如何做到?
B1021 个位数统计
How does the TCP server handle multiple client connections on one port (one-to-one or one to many)
Could not autowire. No beans of ‘userMapper‘ type found.
Test basis 5
Static and final keyword learning demo exercise
Use of file i/o in C
MySQL storage engine and its differences
JVM上篇:内存与垃圾回收篇十--运行时数据区-直接内存
Gradio quickly builds ml/dl Web Services
Jmeter 界面如何汉化?
数据库设计——关系数据理论(超详细)
Deep Qt5 signal slot new syntax
JVM Part 1: memory and garbage collection part 7 -- runtime data area heap
Another skill is to earn 30000 yuan a month+
JVM上篇:内存与垃圾回收篇三--运行时数据区-概述及线程
Read write separation and master-slave synchronization
Interface and abstract class / method learning demo
Slashes / and backslashes involved in writing code\
Introduction to Kali system ARP (network disconnection sniffing password packet capturing)






![[acwing] solution to the 61st weekly match](/img/31/765f4ce9f779e8093668e7606e0198.png)


