spray json, jackson 转到type时多key和少key的比较

有组合关系的三个class定义

A {

  B {

  C {...}

      ...

  }

  ...

}

每个class都有loadFromJson和writeAsJson方法。过去几年,三个class里的成员变量一直在添加,而数据库里有很多json string类型的老数据,为了能够正确的把它们转化为class,就需要对一些域进行判断,举个例子。

在 db 中有一个json string,是这样的 name: xins, age: 24

而几年后C添加了一个新的域,company

那么loadFromJson就要添加判断,如果json中没有company这个key,就要写上 company: null 

现在,要重写A, B, C。目标是,代码尽可能的少,扩展性要好,不要if/else判断域的存在情况。

老数据中json的域不足,转到class时可能会有问题。

class转到json会添加一些域,但这可能没有关系,因为前端可能只从json中拿它感兴趣的key,val

下面测了两种json库,分别是spray.json和jackson_scala_module

结果:

jackson_scala_module在从string json 到 type进行转换时,能够接受域缺失的问题。比如

case class Demo(x: Boolean, y: Int, c: String, d: Double)
val demo = mapper.readValue("{}", classOf[Demo])
println(demo)

Demo(false,0,null,0.0)

 

对于spray.json发生key缺失的情况,则会exception

 

而对于域key出现多余的情况

jackson报错

val demo1 = mapper.readValue("{\"x\": true, \"y\": 1100, \"c\": \"str\", \"d\": \"str\"}", classOf[Demo])

spray.json则没有问题

 

对于变量的顺序则没有关系,两个库都能正确处理key顺序不正确的情况。

 

新的程序是用scala写的,spray框架。首先想到的就是spray.json。从别人的blog上看到spray.json的速度很慢,但是spray对spray.json内置了很多支持,比如post的数据可以通过entity.as[Person]直接转到Person对象。考虑到程序面对的数据量并不太大,spray.json慢点其实无所谓,但多key的情况它处理不了,就用不了了。

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。