Json4s的一些用法 JSon转对象实体 Json转Map Map转Json

Json4s 全称就是Json For Scala,为Scala而生

首先上Maven依赖配置,其实Spark中自带了Json4s如果是编写Spark代码,并不需要单独引用Json4s的依赖了

	<dependency>
      <groupId>org.json4s</groupId>
      <artifactId>json4s-jackson_2.11</artifactId>
      <version>3.3.0</version>
    </dependency>

样例数据:

{"msgValues":"{\"BMS_50\":0.0,\"MCU_RM\":1.0}","brand":"Jork","source":"2","tid":"20200212101010"}

上面这条Json数据msgValues的值也是一条Json,我们先将其转为Map

    val str =
      """
      {"msgValues":"{\"BMS_50\":0.0,\"MCU_RM\":1.0}","brand":"Jork","source":"2","tid":"20200212101010"}
      """.stripMargin

    val jsonStr: JValue = parse(str)//将Json字符串转为 JValue
    implicit val formats = DefaultFormats //Json转任意指定类型必须指定隐士参数,我们这里默认就好

    val mapResult: Map[String, Any] = jsonStr.extract[Map[String, Any]]//使用extract转成Map
    println(mapResult)
   

输出结果:
在这里插入图片描述
我们可以看到外层的Json是已经转为了Map,而内层的msgValues并没有转成Map结构。所以如果我们想要将msgValues转成Map则需要先取出msgValues转成Json再次转成Map,如下操作

	val str =
    """
  	{"msgValues":"{\"BMS_50\":0.0,\"MCU_RM\":1.0}","brand":"Jork","source":"2","tid":"20200212101010"}
    """""".stripMargin

  val jsonStr: JValue = parse(str)
  implicit val formats = DefaultFormats
  
  val msgValueJValue: JValue = jsonStr \ "msgValues"

  val msgValuesJson: JValue = parse(msgValueJValue.values.toString)
  val msgValuesMap: Map[String, Any] = msgValuesJson.extract[Map[String,Any]]
  println(msgValuesMap)
  

输出结果:
在这里插入图片描述
---------=====================================================
接着将JSon字符串映射成自定义实体,我们这里还是用上面的Json字符串,
最外层的实体就叫做JsonObj吧(也就是创建一个样例类)

 val jsonStr: JValue = parse(str)
 implicit val formats = DefaultFormats

 //样例类
 case class JsonObj(msgValues: String,brand: String,source: String,tid: String)

 val jsonObj: JsonObj = jsonStr.extract[JsonObj]
 println(jsonObj.brand+","+jsonObj.source)

结果就是转成功了,可以自由获取其属性了
在这里插入图片描述
但是需要注意的地方就是msgValues只是作为了一个属性塞进去了,如果想对msgVlause进行转成对象,我们应该和转Map类似, 先取单独出来字符串,再新建一个样例类然后再单独去转!这里就不做演示了

-------=========================================
– =接下来Map转Json
-------=========================================

	val tempMap: mutable.Map[String, String] = new scala.collection.mutable.HashMap[String,String]()

    tempMap.put("name","Rone")
    tempMap.put("age","88")
    val map2Json: String = Json(DefaultFormats).write(tempMap)
    println(map2Json)
    println( parse(map2Json) \"name")
  

这样就行了,主要就是调用write方法
–=多态用法=

	trait Animal 
	case class Dog(name: String) extends Animal
    case class Fish(weight: Double) extends Animal
    case class Animals(animals: List[Animal])

    implicit val formats = Serialization.formats(ShortTypeHints(List(classOf[Dog], classOf[Fish])))
  
    val ser =  Json(formats).write(Animals(Dog("pluto") :: Fish(1.2) :: Nil))

    val result: Animals = Json(formats).read[Animals](ser)
    println(result)
    println(result.animals)
    println(result.animals(0).asInstanceOf[Dog].name)

至于自定义Formats这里就不做演示了,等我用到了再更新一下吧。哈哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值