有组合关系的三个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的比较的更多相关文章

  1. 解决 Jackson反序列化 Unexpected token ... , expected VALUE_STRING: need JSON String that contains type id (for subtype of ...)

    首先检查是否是 objectMapper.enableDefaultTyping(); 的受害者.优先考虑删除该配置. 使用Jackson把数组的json字符串反序列化为List时候报了个JsonMa ...

  2. Json --- Jackson工具

    一.Jackson简介 Jackson是一个简单基于Java应用库,Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json.xml转换成Java对象.Jackson ...

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

    对于json对像,怎么遍历json对象的所有key,在使用json对象时,如果无法知道key,怎么通过key变量来获取值?请参阅下面的关键代码: <html> <head> & ...

  4. 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 ...

  5. 【原创】大叔问题定位分享(12)Spark保存文本类型文件(text、csv、json等)到hdfs时为什么是压缩格式的

    问题重现 rdd.repartition(1).write.csv(outPath) 写文件之后发现文件是压缩过的 write时首先会获取hadoopConf,然后从中获取是否压缩以及压缩格式 org ...

  6. 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 ...

  7. Github 访问时出现Permission denied (public key)

    一. 发现问题: 使用 git clone 命令时出现Permission denied (public key) . 二. 解决问题: 1.首先尝试重新添加以前生成的key,添加多次,仍然不起作用. ...

  8. 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 ...

  9. json jackson

    1.引入依赖 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId&g ...

随机推荐

  1. Android文档 - 账户管理器概述

    账户管理器概述 这个类提供了访问到 用户在线账户的集中式注册中心 的能力.用户为每账户输入一次 认证信息(credentials,包含用户名和密码),过过 点击一次(one-click)完成认证的方式 ...

  2. openvpn之client配置篇

    对于client端,其配置目录文件下有如下文件: [root@localhost client1]# ll total -rw-r--r-- nobody nobody Sep ca.crt -rw- ...

  3. 找回IntelliJ IDEA中 丢失的Run Dashboard 视图

    一般有时候创建springboot项目的时候右下角可以提示你打开Run Dashboard,但是如果不提醒就需要自己配置了. 找到项目中.idea文件下的workspace.xml开打 接下来找到 & ...

  4. PHP也玩并发,巧用curl 并发减少后端访问时间

    首先,先了解下 php中的curl多线程函数: # curl_multi_add_handle# curl_multi_close# curl_multi_exec# curl_multi_getco ...

  5. 微信小程序 --- e.currentTarget.dataset.id 获取不到值

    直接代码 wxml代码片段 <view class='ranksList' wx:for="{{ranksLb}}"> <view class='ranksLis ...

  6. Linux系统下邮件服务器的搭建(Postfix+Dovecot)

    对于网站来说,发送各种例如注册通知的邮件是很基本的一个需求,之前我一直用的是腾讯的企业邮箱,感觉挺方便的,直接可以绑定QQ邮箱接收邮件,网站配置一下SMTP也就可以发出邮件. 但是在前几天由于有重要信 ...

  7. n个括号对的所有可能情况

    所有可能情况的数量为卡特兰数.故求所有可能的出栈情况与此类似. 思路: 若左括号没全插入,则插入左括号: 若已插入左括号数比已插入右括号数多,则插入右括号: #include<stdio.h&g ...

  8. 关于源码输出,浏览器不解析Html标签

    有时候根据需要我们需要看到浏览器上源码效果如: 但是我如果在html中输入 <a href = 'http://www.baidu.com'>百度</a>那么问题来了,总是显示 ...

  9. 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 ...

  10. Maven 构建生命周期

    构建生命周期是什么? 构建生命周期阶段的目标是执行顺序是一个良好定义的序列.这里使用一个例子,一个典型的 Maven 构建生命周期是由下列顺序的阶段: 阶段 处理 描述 准备资源 资源复制 资源复制可 ...