使用json4s,在scala语言里面解析json
使用org.json4s实现json字符串,对象,map,list相互转换
1. json转map,map转json
nam | fun |
---|---|
parse | parse(str,useBigDecimalForDouble =true) |
serialize | implicit val formats=Serialization.formats(NoTypeHints) |
write/read | val ser=write(Person(“tom”,123))read[Person](ser) |
deserialize | |
DefaultFormats | implicit 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 |
extract | implicit val format=DefaultFormats 转为case对象 (Jvalue \ "children").extract[List[Chiild]] json.camelizeKeys.extract[Person] ((json \ "children")(0) \ "birthdate").extract[Date] |
decompose | |
toXml | toXml(jsonstr) import org.json4s.Xml.{toJson, toXml} |
toJson | val json=toJson(xml) pretty(render(json)) import org.json4s.Xml.{toJson, toXml} |
render | render(map/list) //结果为对象 |
compact | compact(render(map/list)) ,结果为str,如果有none,自动remove |
pretty | pretty(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
name | fun |
---|---|
diff | Jvalue diff Jvalue2,结果为:除了公共部分 |
\\ | 所有name Jvalue1 \\ "name" 所有int JValue \\ classOf[JInt] |
\ | 子类 Jvalue \ "data" \"name" ,结果会自动也转换 |
findField | Jvalue findField{case JFirld("name",_) => true case_=>false} |
filterFirld | Jvalue filterFirld{case JFirld("name",_) => true case_=>false} |
transformField | Jvalue transformField{case JField("name", JString(s)) => ("NAME", JString(s.toUpperCase))}} |
values | Jvalue.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))