2017-02-09 5 views
0

以前はXMLファイルを使用していたシステム(JSONファイルを使用しているシステム)をリファクタリングしています。テストケースにはXMLに似たJSONファイルをスカラーにロード

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

を次のように、XMLファイルは値がXPathを使用して読まれる読まれ、

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

私はJSONでこれを行う方法がわかりませんよ。使用するのに似たものはありますか?

答えて

0

私は、XPathのサポートが表現ウェブサイト

スカーラ>輸入org.json4s.jackson.JsonMethods._

からコピー

のようにありますがjson4s

を見てすることをお勧めします

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 = jオブジェクト(一覧( (人、jオブジェクト(一覧((名前、JSTRING(マリリン))、 (年齢、JINT(33)))))))>コンパクト(レンダリング(RES0))

RES1

スカラ:文字列= { "人":{ "名前": "マリリン"、「年齢":33}}

scala> compact(render(json \" name "))

RES2:文字列= { "名前": "ジョー"、 "名": "マリリン"}

スカラ>コンパクトは(((JSON形式のremoveField {_ == JField( "名前"、JSTRING(レンダリング"マリリン"))})\ "名"))

RES3:文字列= { "名前": "ジョー"}

スカラ>コンパクト(レンダリング(JSONの\ "人" \ "名前") )

RES4:文字列= "ジョー"

+0

ありがとうございました.Jsonファイルの読み方を教えてください。 –

+0

スカラー 'Source.fromFile'またはjava' Files.readAllBytes'と組み合わせたjson4sの 'parse'を使用します。' parse(Source.fromFile( "blah.json")。mkString)) ' –

0

ScalaでJSONを扱うために利用できるさまざまなライブラリがあります。私はちょうど最近circeを使用しており、非常にそれをお勧めすることができます。 opticsと組み合わせてJSONを簡単にトラバースして変更することができます。 (ウェブサイトからコピーされた例):また、ケースクラスからの/秘密の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) 

関連する問題