2016-08-11 5 views
1

Pythonの背景から来て、私はScalaでJSONを適切に解析するのが難しいと感じています(特にJSONが特定のスキーマに従わない場合)。Scalaのjson構文解析のようなPython?

Pythonは簡単にJSONを解析し、あなたがdict.keys()を使用して要素を反復処理することができ、dict.values()など

case classを定義することなくJSONを解析することができますScalaではどんな良いJSONライブラリは、あります。これは、JSONをネストした場合、非常に苦しいようです。

私はそれらの両方が、ScalaのオブジェクトにJSONを反映するために、多くのケースクラスを必要とする...我々はこのすべてを行うことなく解析し、抽出値はできGsonとJson4sを試してみましたか?

答えて

0

Argonautはすばらしいライブラリです。コーデックの定義、JSONのトラバース、JSONの解析に優れた機能を備えています。

(ドキュメントから)この例では、ケースクラスを定義せずに解析する例を示します

package argonaut.doc 

import scalaz._, Scalaz._ 
import argonaut._, Argonaut._ 

object ParseExample extends App { 

    val json = """ 
    { "name" : "Toddler", "age" : 2, "greeting": "gurgle!" } 
    """ 

    // Parse getting either error message or json 
    val result: String \/ Json = 
    Parse.parse(json) 

    // Parse ignoring error messages 
    val option: Option[Json] = 
    Parse.parseOption(json) 

    // Parse handling success and failure with functions 
    val greeting1: String = 
    Parse.parseWith(json, _.field("greeting").flatMap(_.string).getOrElse("Hello!"), msg => msg) 

    // Parse handling success and providing a default for failure 
    val greeting2: String = 
    Parse.parseOr(json, _.field("greeting").flatMap(_.string)getOrElse("Hello!"), "Oi!") 

} 
0

lift JSONライブラリを使用してください。あなたのbuild.sbt内でこれを追加します。

"net.liftweb" %% "lift-json-scalaz" % "3.0-M1"

そして、例えば、あなたのコード内で:

import net.liftweb.json._ 
import net.liftweb.json.DefaultFormats 
object test { 
    def main(args: Array[String]) { 
     //This is used to map the JSON string to a object in Scala. The constructor parameters have to match the keys in the JSON object. 
     case class PersonObject (name: String, Age: String) 

     implicit val formats = DefaultFormats 

     val jsonString = """ { "name":"Bob", "Age":"14" } """ 
     val parsedJson = parse(jsonString) 
     val extractedInJsonObject = parsedJson.extract[PersonObject] 
     val name = extractedInJsonObject.name 
    } 

} 

は、これはあなたがリフトJSONライブラリを使用したい場合は、上記の例です。より多くの情報を見つけるには、このマニュアルを見て:
https://github.com/lift/lift/tree/master/framework/lift-base/lift-json

ドキュメントのこの部分はあなたのための役に立つかもしれない: https://github.com/lift/lift/tree/master/framework/lift-base/lift-json#extracting-values

あなたのJSONはネストされたオブジェクトがある場合:ご次に

{ 
    "name" : "Bob", 
    "age": "15", 
    "address" : { 
    "street" : "miller avenue", 
    "city" : "San Francisco" 
    } 
} 

をcaseクラスは次のようになります:

case class Address(street: String, city: String) 
case class Person(name: String, age: String, address: Address) 

通常、別の選択肢がないケースクラスを使用する必要があります。あなたが別の方法を見つけたら私に知らせてください!