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的情况它处理不了,就用不了了。

时间: 2025-01-12 19:29:35

spray json, jackson 转到type时多key和少key的比较的相关文章

对于json对像,怎么遍历json对象的所有key,在使用json对象时,如果无法知道key,怎么通过key变量来获取值

对于json对像,怎么遍历json对象的所有key,在使用json对象时,如果无法知道key,怎么通过key变量来获取值?请参阅下面的关键代码: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gbk"/> <script type="text/javascript"> var smsTypeDesc

org.json.JSONException: Value of type java.lang.String cannot be converted to JSONObject

Value of type java.lang.String cannot be converted to JSONObject 解析服务器返回的Json串时,JSONObject对象抛出了这个异常. 原以为是返回的json格式错误了,仔细对比看不出所以然.至少字符上看是格式没问题的.. 那就可能是编码的问题了.仔细比较每个字符,的确在json串头部发现字符:"\ufeff" . 客户端解决方案: 1 public static final String removeBOM(Strin

Spring MVC 前后台传递json格式数据 Content type &#39;application/x-www-form-urlencoded;charset=UTF-8&#39; not supported

报错如下: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported 解决方案: 引入如下包: 问题既解决. Spring MVC 前后台传递json格式数据 Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported

json jackson

1.引入依赖 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.8.3</version> </dependency> 2.添加 conventer <mvc:annotation-driven> <mvc:message

C/C++,Java,PHP,JavaScript,Json数组、对象赋值时,最后一个元素后面是否可以带逗号?

1 C,C++,Java,PHP都能容忍末尾的逗号 C,C++,Java中对数组赋值时,最后一个元素末尾的逗号可有可无.下面两行代码对这些语言来说是等效的. int a[] = {1,2,3}; /* 正确 */ int a[] = {1,2,3,}; /* 正确 */ PHP这一点也继承了C的特点,下面的两行代码等效. $a = array(1,2,3); /* 正确 */ $a = array(1,2,3,); /* 正确 */ 2 JavaScript视末尾逗号为语法错误! 然而到了Jav

JSON方式提交文档时SOLR报:AtomicUpdateDocumentMerger Unknown operation for the an atomic update, operation ignored

文档是数组转成的json 原数组: array( 0 =>3, 1 =>3, 2 =>4, 3 =>5, 4 =>5, 5 =>6) 用array_unique去掉数组中重复的元素后,插入时报错. 原因: array_unique去重之后,原数组的下标被保留了.数组为 array( 0 =>3, 2 =>4, 3 =>5, 5 =>6 ) 在json_encode数组时,会把下标不连续的数组解析成json字符串例如{"0":&

C#对 Json的序列化和反序列化时出现“k_BackingField”

在C#2.0的项目中,以前经常使用Json.NET实现序列化和反序列化.后来从c#3.0中开始使用新增的DataContractJsonSerializer进行json相关的操作.微软提供的原生类库使用上并不复杂,参考一下msdn你很容易就会写出序列化和反序列化的方法. 不过使用该类库方法的过程中还是不慎意外发现了k_BackingField. 举例之前说一下我们的一个简单的实体类Person,它有如下定义: Person实体 public class Person { public int I

使用Jackson的@JsonFormat注解时出现少了 8 个小时

比如数据库存的日期是2018-01-05,转成json则变成了2018-01-04 解决办法: @JsonFormat(pattern="yyyy-MM-dd") public Date getRegistDate() {  return this.registDate; } 改成 @JsonFormat(pattern="yyyy-MM-dd",timezone="GMT+8") public Date getRegistDate() {  r

产品经理在外包项目时如何踩更少的坑

说起这个经历,还是挺难忘.背景还是上家公司(名字问题,误以为是另外一家公司,发现同事不错,就没走了.),刚开始自己没有技术组,外包出去的项目,接手的时候那套系统,唉,真破.BUG不断,错漏百出. 好了,开始接触外包公司了.交接给我的时候可好说话了,艾玛哥哥就屁颠屁颠的花了两三天弄了个PRD给他们,后来周四给他们,额,人家不接受你的AXURE原型和文档.后来他们丢了一套自己的文档.也就是这PPT格式的PRD=.= 其实,也知道他们是在拖工期(因为之前就在外包公司呆过,罪过罪过~),当时就提议换掉或