2017-02-09 70 views
0

我在使用XML文件重构一个使用JSON文件的系统(使用scala编写)。在scala中加载类似于XML的JSON文件

在测试情况下,一个XML文件内容如下

import scala.xml.XML 
val xml = XML.loadFile("/Users/al/Projects/Scala/yahoo-weather.xml") 

值被使用XPath读取,

val temp = (xml \\ "channel" \\ "item" \ "condition" \ "@temp") text 

我不确定如何使用JSON做到这一点。有没有类似的用法?

回答

0

我建议你看一下json4s

有XPath的支持,例如从网站复制

斯卡拉>进口org.json4s.jackson.JsonMethods._

表达

scala> import org.json4s.JsonDSL._

scala> val json =

("person" -> 
    ("name" -> "Joe") ~ 
    ("age" -> 35) ~ 
    ("spouse" -> 
     ("person" -> 
     ("name" -> "Marilyn") ~ 
     ("age" -> 33) 
    ) 
    ) 
) 

阶> JSON \ “配偶”

RES0:org.json4s.JsonAST.JValue = JObject(列表( (人,JObject(列表((姓名,的jstring(玛丽莲)), (年龄,JInt(33)))))))

阶>紧凑(渲染(RES0))

RES1:字符串= { “人”:{ “名称”: “玛丽莲”,“年龄“:33}}

scala> compact(render(json \”name“))

RES2:字符串= { “名称”: “乔”, “姓名”: “玛丽莲”}

阶>紧凑(渲染((JSON removeField {_ == JField( “姓名”,的jstring( “玛丽莲”))})\ “名称”))

RES3:字符串= { “名称”: “乔”}

阶>紧凑(渲染(JSON \ “人” \ “名称”) )

RES4:字符串= “乔”

+0

谢谢,你能让我知道我怎么读一个json文件。 –

+0

将json4s'parse'与scala结合使用'Source.fromFile'或java'Files.readAllBytes',即'parse(Source.fromFile(“blah.json”)。mkString))' –

0

有各种库可用于在Scala中使用JSON。我刚刚使用circe,并且可以高度推荐它。您可以结合使用optics轻松遍历和修改您的JSON,例如(例如,从网站复制):

import cats.syntax.either._ 
import io.circe._, io.circe.parser._ 

val json: Json = parse(""" 
{ 
    "order": { 
    "customer": { 
     "name": "Custy McCustomer", 
     "contactDetails": { 
     "address": "1 Fake Street, London, England", 
     "phone": "0123-456-789" 
     } 
    }, 
    "items": [{ 
     "id": 123, 
     "description": "banana", 
     "quantity": 1 
    }, { 
     "id": 456, 
     "description": "apple", 
     "quantity": 2 
    }], 
    "total": 123.45 
    } 
} 
""").getOrElse(Json.Null) 

import io.circe.optics.JsonPath._ 
// import io.circe.optics.JsonPath._ 

val _phoneNum = root.order.customer.contactDetails.phone.string 
// _phoneNum: monocle.Optional[io.circe.Json,String] = [email protected] 

val phoneNum: Option[String] = _phoneNum.getOption(json) 
// phoneNum: Option[String] = Some(0123-456-789) 

您也可以从案例类定义加密/解码器隐蔽JSON对象/或使用​​免费的样板,通用推导。