使用json4s,在scala语言里面解析json

使用json4s,在scala语言里面解析json

使用org.json4s实现json字符串,对象,map,list相互转换

1. json转map,map转json

官方教程

官方图片

namfun
parseparse(str,useBigDecimalForDouble =true)
serializeimplicit val formats=Serialization.formats(NoTypeHints)
write/readval ser=write(Person(“tom”,123))
read[Person](ser)
deserialize
DefaultFormatsimplicit val format:Formats=new DefaultFormats{
override def dateFormatter=new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss.SSS’Z’”) //日期
override val strictOptionParsing:Boolean=true //option
override val strictArrayExtraction:Boolean=true//array
override val strictMapExtraction:Boolean=true//map
override val considerCompanionConstructors =false//apply
}

DefaultFormats.strict
DefaultFormats.withStrictMapExtraction
DefaultFormats.withStrictArrayExtraction
DefaultFormats.withStrictOptionParsing
extractimplicit val format=DefaultFormats
转为case对象(Jvalue \ "children").extract[List[Chiild]]
json.camelizeKeys.extract[Person]
((json \ "children")(0) \ "birthdate").extract[Date]
decompose
toXmltoXml(jsonstr)
import org.json4s.Xml.{toJson, toXml}
toJsonval json=toJson(xml)
pretty(render(json))
import org.json4s.Xml.{toJson, toXml}
renderrender(map/list) //结果为对象
compactcompact(render(map/list)) ,结果为str,如果有none,自动remove
prettypretty(render(map/list)) //比compact多了缩进
        <dependency>
            <groupId>org.json4s</groupId>
            <artifactId>json4s-core_2.12</artifactId>
            <version>3.6.6</version>
        </dependency>
        <dependency>
            <groupId>org.json4s</groupId>
            <artifactId>json4s-jackson_2.12</artifactId>
            <version>3.6.6</version>
        </dependency>
import org.json4s._  //解析json
//import org.json4s.native.JsonMethods._  //没有jsonson支持
import org.json4s.JsonDSL._  //生成json
//import org.json4s.JsonDSL.WithDouble._  //double
//import org.json4s.JsonDSL.WithBigDecimal._  //bigdouble
import org.json4s.jackson.JsonMethods._  //jsonson 支持,parse,extract ,compact

import org.json4s.jackson.Serialization  //Serialization
import org.json4s.jackson.Serialization.{write,read}  //write


val str="""{a:123,b:123}"""
parse(str) //得到JValue对象,不完整会报错,可以try catch
parse(str) \ "a" //获取a
(parse(str) \ "a").values //获取a的值,如果值为json,结果为map类型

val map=Map("a"->123,"b"->123)
compact(map) //得到json字符串
pretty(map) 

for{
    JObject(child) <- JValues
    JField("age",JInt(age)) <- child
}yield age
for {
         JObject(child) <- json
         JField("name", JString(name)) <- child
         JField("age", JInt(age)) <- child
         if age > 4
       } yield (name, age) //获取所有age>4的name个age 》为List
namefun
diffJvalue diff Jvalue2,结果为:除了公共部分
\\所有name Jvalue1 \\ "name"
所有int JValue \\ classOf[JInt]
\子类 Jvalue \ "data" \"name",结果会自动也转换
findFieldJvalue findField{case JFirld("name",_) => true case_=>false}
filterFirldJvalue filterFirld{case JFirld("name",_) => true case_=>false}
transformFieldJvalue transformField{case JField("name", JString(s)) => ("NAME", JString(s.toUpperCase))}}
valuesJvalue.values

2. json转对象,对象转json

import org.json4s._
import org.json4s.jackson.Serialization
import org.json4s.jackson.Serialization.{read,write}

implicit val format=Serialization.formats(NoTypeHints)
//对象转json
case class Person(name:String,age:Int)
val ser=write(Person("tom",12))  //对象转json字符串 str:{"name":"tom","age":123}
read[Person](ser)   //json字符串转对象 :Person(tom,123)
compact(render(parse(ser).snakizeKeys))  //json转json


//定义类型
implicit val formats: Formats = Serialization.formats(ShortTypeHints(List(classOf[Dog], classOf[Fish])))
write(Animals(Dog("pluto") :: Fish(1.2) :: Nil))  //对象转json
read[Animals](ser) //json转对象

//序列化和解序列化
implicit val formats: Formats = DefaultFormats + FieldSerializer[WildDog]()
case class FieldSerializer[A: Manifest](
  serializer:   PartialFunction[(String, Any), Option[(String, Any)]] = Map(),
  deserializer: PartialFunction[JField, JField] = Map()
)


val dogSerializer = FieldSerializer[WildDog](
  renameTo("name", "animalname") orElse ignore("owner"),
  renameFrom("animalname", "name"))
implicit val formats: Formats = DefaultFormats + dogSerializer


case class Log(id: String, startTime: Long, endTime: Long)
val logSerializer = FieldSerializer[Log](
  renameTo("startTime", "start-time") orElse renameTo("endTime", "end-time"),
  renameFrom("start-time", "startTime") orElse renameFrom("end-time", "endTime"))

implicit val formats: Formats = DefaultFormats + logSerializer

3. xml转json

import org.json4s.Xml.{toJson, toXml}
val xml =
         <users>
           <user>
             <id>1</id>
             <name>Harry</name>
           </user>
           <user>
             <id>2</id>
             <name>David</name>
           </user>
         </users>
val json=toJson(xml)
pretty(render(json))
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

厨 神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值