Gson在Scala中的使用,null类型的转换

官方描述:

Gson是一个Java库,可用于将Java对象转换为其JSON表示。它还可以用于将JSON字符串转换为等效的Java对象。

Gson 是用于将 Java 对象与 JSON格式字符串数据相互转换的 Java 库。它起初在Google 内部广泛使用在 Android 平台Java 服务端上。2008 年开源之后,成为了谷歌又一个被广泛使用的开源框架,相同作用的类库还有 Spring Framework 中集成的 Jackson,以及阿里开源的 FastJson等。

Gson是解析json速度最快的工具

主要用于处理JSON数据,可实现序列化反序列化

Gson对象的创建有两种方式:

  1. val gson:Gson=new Gson()

  2. val gson=new GsonBulider().creat()

第二种方式可以制定额外的行为,如格式化,是否序列化null值

  • 序列化scala对象

class Person(val name: String, val age: Int,val hobby:AnyRef) {
    println("调用Person")
}

object gsonTest {
    def main(args: Array[String]): Unit = {
        //构建类对象
        val p1 = new Person("www", 11,null)
        //创建gson
        val gson: Gson = new Gson
        //序列化p1
        println(gson.toJson(p1))
        
        //使用方式二修改格式
        val gson1: Gson = new GsonBuilder().setPrettyPrinting.create()
        println(gson1.toJson(p1))
    }
}

输出:

正常序列化后的 JSON 字符串是紧凑格式,节省字符串内存,使用GsonBuilderset().setPrettyPrinting 方法之后最终输出的 JSON 字符串是更易读的格式。

发现默认的Gson对象null字段会被忽略,可使用serializeNulls来序列化null字段

val builderGson: Gson = new GsonBuilder().setPrettyPrinting.serializeNulls.create
println(builderGson.toJson(p1))


  • 反序列化

val jsonStr: String = "{\"name\":\"jack\",\"age\":18,\"hobby\":null}"
//通过json字符串构建scala对象
val p2: Person = gson.fromJson(jsonStr,classOf[Person])
println(s"name:${p2.name},age:${p2.age}")

输出

 

  • 其他功能

可使用JsonObject生成对象,再使用toJson生成JSON字符串

可将JSON字符串化为Map集合

可将JSON数据与Array,List互相转换

自定义序列化

自定义序列化:

可以实现对某些字段进行特殊处理,比如隐藏某些字段的序列化,对字段的数据格式化处理等

也可以针对某种类型进行处理

把所有String字段变为数字11

/对象
class MyObject(val hobby: String,val name:String,val age:Int){
}
​
//继承JsonSerializer 接口
class nullTypeSerializer extends JsonSerializer[String]{
  //自定义serialize方法
  override def serialize(src: String, typeOfSrc: Type, context: JsonSerializationContext) =
    new JsonPrimitive(11)
}
​
object gsonTest {
  def main(args: Array[String]): Unit = {
    val myObject=new MyObject("test","jack",18)
    //原序列化
    val gson:Gson=new Gson()
    println("原格式为:"+gson.toJson(myObject))
​
    //自定义序列化
    val gson1: Gson = new GsonBuilder().serializeNulls().registerTypeAdapter(classOf[String], new nullTypeSerializer()).create()
    val jsonStr=gson1.toJson(myObject)
    println("自定义序列化的结果为:"+jsonStr)
  }
}

结果:

所有String字段成功变为11,其他类型字段为发生改变

尝试对所有Null字段进行处理

null字段未发生改变

查看adapter源码

value等于null的时候,直接输出了null

可以通过注册自定义adapter来修改

//对象
class MyObject(val hobby: String, val name: String, val age: Int) {
}
​
//继承JsonSerializer 接口
class nullTypeSerializer extends JsonSerializer[Null] {
  //自定义serialize方法
  override def serialize(src: Null, typeOfSrc: Type, context: JsonSerializationContext) =
    new JsonPrimitive(11)
}
​
object gsonTest {
  val str: TypeAdapter[String] = new TypeAdapter[String] {
    override def read(in: stream.JsonReader): String = {
      if (in.peek() == JsonToken.NULL) {
        in.nextNull()
        ""
      } else {
        in.nextString()
      }
    }
​
    override def write(out: stream.JsonWriter, value: String): Unit = {
      if (value == null) {
        out.value("")
      } else {
        out.value(value)
      }
    }
  }
​
  def main(args: Array[String]): Unit = {
    val myObject = new MyObject(null, "jack", 18)
    //原序列化
    val gson: Gson = new Gson()
    println("原格式为:" + gson.toJson(myObject))
​
    //使用自定义适配器
    val gson1 = new GsonBuilder()
    gson1.serializeNulls().registerTypeAdapter(classOf[String], str)
    val gson2 = gson1.create()
    val jsonStr = gson2.toJson(myObject)
    println("自定义序列化的结果为:" + jsonStr)
  }
}

输出:

null值成功变成了空字符串

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值