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)
其实这个结果是不太理想的,我更希望当一个域不出现时,该域就不要在json中出现。比如false, 0 和 null 的地位是不一样的。false, 0 是个有效的值,而null则明确说明没有值。
对于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的情况它处理不了,就用不了了。
update: json4s
后来我又测试了下 json4s,发现json4s对于多key或者少key的情况都能正确的处理,唯一的问题是case class每个域都要用option来修饰,不太美观
import org.json4s._
import org.json4s.jackson.JsonMethods._ object Json4s extends App {
implicit val formats = DefaultFormats case class Child(name: Option[String], age: Int, birthdate: Option[java.util.Date]) case class Address(street: String, city: String) case class Person(name: Option[String], address: Address, children: Option[List[Child]]) val json = parse( """
{ "name": "joe",
"sss" : "sss",
"ssss" : ,
"address": {
"street": "Bulevard",
"city": "Helsinki"
},
"children": [
{
"name": "Mary",
"age": ,
"birthdate": "2004-09-04T18:06:22Z"
},
{
"name": "Mazy",
"age":
}
]
}
""") println(json.extract[Person])
}
spray json, jackson 转到type时多key和少key的比较的更多相关文章
- 解决 Jackson反序列化 Unexpected token ... , expected VALUE_STRING: need JSON String that contains type id (for subtype of ...)
首先检查是否是 objectMapper.enableDefaultTyping(); 的受害者.优先考虑删除该配置. 使用Jackson把数组的json字符串反序列化为List时候报了个JsonMa ...
- Json --- Jackson工具
一.Jackson简介 Jackson是一个简单基于Java应用库,Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json.xml转换成Java对象.Jackson ...
- 对于json对像,怎么遍历json对象的所有key,在使用json对象时,如果无法知道key,怎么通过key变量来获取值
对于json对像,怎么遍历json对象的所有key,在使用json对象时,如果无法知道key,怎么通过key变量来获取值?请参阅下面的关键代码: <html> <head> & ...
- new JSONObject(str)无法解析 报错:org.json.JSONException: Value of type java.lang.String cannot be converted to JSONObject
org.json.JSONException: Value of type java.lang.String cannot be converted to JSONObject 解析服务器返回的Jso ...
- 【原创】大叔问题定位分享(12)Spark保存文本类型文件(text、csv、json等)到hdfs时为什么是压缩格式的
问题重现 rdd.repartition(1).write.csv(outPath) 写文件之后发现文件是压缩过的 write时首先会获取hadoopConf,然后从中获取是否压缩以及压缩格式 org ...
- ASP.NET MVC another entity of the same type already has the same primary key value
ASP.NET MVC项目 Repository层中,Update.Delete总是失败 another entity of the same type already has the same pr ...
- Github 访问时出现Permission denied (public key)
一. 发现问题: 使用 git clone 命令时出现Permission denied (public key) . 二. 解决问题: 1.首先尝试重新添加以前生成的key,添加多次,仍然不起作用. ...
- Attaching an entity of type 'xxx' failed because another entity of the same type already has the same primary key value.
问题的详细描述: Attaching an entity of type 'xxxxx' failed because another entity of the same type already ...
- json jackson
1.引入依赖 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId&g ...
随机推荐
- Android文档 - 账户管理器概述
账户管理器概述 这个类提供了访问到 用户在线账户的集中式注册中心 的能力.用户为每账户输入一次 认证信息(credentials,包含用户名和密码),过过 点击一次(one-click)完成认证的方式 ...
- openvpn之client配置篇
对于client端,其配置目录文件下有如下文件: [root@localhost client1]# ll total -rw-r--r-- nobody nobody Sep ca.crt -rw- ...
- 找回IntelliJ IDEA中 丢失的Run Dashboard 视图
一般有时候创建springboot项目的时候右下角可以提示你打开Run Dashboard,但是如果不提醒就需要自己配置了. 找到项目中.idea文件下的workspace.xml开打 接下来找到 & ...
- PHP也玩并发,巧用curl 并发减少后端访问时间
首先,先了解下 php中的curl多线程函数: # curl_multi_add_handle# curl_multi_close# curl_multi_exec# curl_multi_getco ...
- 微信小程序 --- e.currentTarget.dataset.id 获取不到值
直接代码 wxml代码片段 <view class='ranksList' wx:for="{{ranksLb}}"> <view class='ranksLis ...
- Linux系统下邮件服务器的搭建(Postfix+Dovecot)
对于网站来说,发送各种例如注册通知的邮件是很基本的一个需求,之前我一直用的是腾讯的企业邮箱,感觉挺方便的,直接可以绑定QQ邮箱接收邮件,网站配置一下SMTP也就可以发出邮件. 但是在前几天由于有重要信 ...
- n个括号对的所有可能情况
所有可能情况的数量为卡特兰数.故求所有可能的出栈情况与此类似. 思路: 若左括号没全插入,则插入左括号: 若已插入左括号数比已插入右括号数多,则插入右括号: #include<stdio.h&g ...
- 关于源码输出,浏览器不解析Html标签
有时候根据需要我们需要看到浏览器上源码效果如: 但是我如果在html中输入 <a href = 'http://www.baidu.com'>百度</a>那么问题来了,总是显示 ...
- Android Studio错误提示:Gradle project sync failed. Basic functionality (eg. editing, debugging) will not work properly
Android Studio中出现提示: Gradle project sync failed. Basic functionality (eg. editing, debugging) will n ...
- Maven 构建生命周期
构建生命周期是什么? 构建生命周期阶段的目标是执行顺序是一个良好定义的序列.这里使用一个例子,一个典型的 Maven 构建生命周期是由下列顺序的阶段: 阶段 处理 描述 准备资源 资源复制 资源复制可 ...