友友之前接手同事的代码的时候,被一整溜儿的 JSONObject.get 给妥妥的震惊了。作为一个java面向对象开发的信徒外加强迫症,实在无法接受这种写法,于是,二话不说,给他改。
scala是基于Java开发的,所以,理论上,java能实现的方法,scala也是可以实现的。
但是对于列表元素是对象的json转化,java的那些方法似乎不是那么好使,以下是好使代码
pom:
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-scala_${scala.binary}</artifactId>
<version>2.9.5</version>
</dependency>
工具类:
import com.fasterxml.jackson.annotation.JsonInclude.Include
import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.databind.{DeserializationFeature, ObjectMapper, SerializationFeature}
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import org.apache.commons.lang3.StringUtils
object JsonParse {
/**
* Jackson ObjectMapper
*/
val om = new ObjectMapper()
.setSerializationInclusion(Include.NON_NULL)
.enable(SerializationFeature.INDENT_OUTPUT)
.registerModule(DefaultScalaModule)
.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
/**
* json 2 对象
* @param json
* @param clazz
* @tparam T
* @return
*/
def formatJson[T](json: String, clazz: Class[T]): T = if (StringUtils.isBlank(json)) null.asInstanceOf[T] else om.readValue(json, clazz)
/**
* 对象 2 json
* @param v
* @return
*/
def toJson(v: Any): String = om.writeValueAsString(v)
}
实体类:
class Entitys {
var dimensions: Array[Entity] = _
}
case class Entity(id: String, name: String, `type`: String)
调用:
val entity = try JsonParse.formatJson(jsonString, classOf[Entity])
catch {
case e: Throwable => throw new RuntimeException("Invalid json", e)
}
entity
搞定,收工~