在kotlin中分解json解析的习惯性方式
假设我们有一个JsonNode
对象jsonNodeObj
,它需要被分析到多个类ClassA
, ClassB
, ClassC
等中的一个。我可以这样做(不能更丑陋):
val mapper = ObjectMapper() try { mapper.treeToValue(jsonNodeObj, ClassA::class.java) } catch (e1: Exception) { try { mapper.treeToValue(jsonNodeObj, ClassB::class.java) } catch (e2: Exception) { try { mapper.treeToValue(jsonNodeObj, ClassC::class.java) } catch (e3: Exception) { ... } } }
有什么更好的方式就像用when
方式?
绝对有更好的方法来做到这一点。 你可以定义一个函数,在成功时返回true,在exception时返回false,例如:
inline fun ObjectMapper.treeToValueOrNull(node : TreeNode) : T? = try { treeToValue(node, T::class.java) } catch (ex : Exception) { null }
这是有效的,因为在Kotlin中try
– catch
-statements可以有一个返回值。 现在,您可以使用when
处理json:
lateinit var object : Any when { mapper.treeToValueOrNull(jsonNodeObj)?.let { object = it } != null -> dosthA(object as ClassA) mapper.treeToValueOrNull(jsonNodeObj)?.let { object = it } != null -> dosthB(object as ClassB) mapper.treeToValueOrNull(jsonNodeObj)?.let { object = it } != null -> dosthC(object as ClassC) }
pvvrieze发现了一个更短的解决方案 :
val object = mapper.treeToValueOrNull(jsonNodeObj) ?: mapper.treeToValueOrNull(jsonNodeObj) ?: mapper.treeToValueOrNull(jsonNodeObj)
- 即使使用jackson-datatype-jsr310,Instant也不能被序列化为适当的格式
- 基于科林地图的属性和jackson不工作 – 委托点不同的地图,即地图属性
- 如何在Kotlin中使用Jackson JsonSubTypes注释
- SpringBoot + Jackson + Kotlin数据类:字段注释被忽略
- 在Kotlin中,FasterXML / jackson循环引用,@JsonIdentityInfo和UnresolvedForwardReference异常
- jackson-dataformat-csv不会忽略未知属性
- Java / Kotlin:为什么Jackson解析日期与SimpleDateFormat不同?
- Jackson与Kotlin混合
- 覆盖一些控制器的@JsonIgnore注释。 杰克逊。 弹簧