16

私の問題は、Twitter などから JSON テキストを受け取ることです。次に、このテキストを scala のネイティブ オブジェクトに変換します。これを行う標準的な方法はありますか?Play 2も使用しています

これが私が持っているものです

import scala.io.Source.{fromInputStream}
import java.net._

val url = new URL("https://api.twitter.com/1/trends/1.json")
val content = fromInputStream( url.openStream ).getLines.mkString("\n")
val json = Json.parse(content)
val a = (json \ "trends" )
Ok(a(0))

JSONからすべてのトレンド名を取得したい

4

5 に答える 5

7

私は個人的に好きですが、 PlayのJSONライブラリlift-jsonを使用してこれを行うのは非常に簡単です:

import play.api.libs.json._
import scala.io.Source

case class Trend(name: String, url: String)

implicit object TrendReads extends Reads[Trend] {
  def reads(json: JsValue) = Trend(
    (json \ "name").as[String],
    (json \ "url").as[String]
  )
}

val url = new java.net.URL("https://api.twitter.com/1/trends/1.json")
val content = Source.fromInputStream(url.openStream).getLines.mkString("\n")
val trends = Json.parse(content) match {
  case JsArray(Seq(t)) => Some((t \ "trends").as[Seq[Trend]])
  case _ => None
}

現在、これにより次のようになります。

scala> trends.foreach(_.foreach(println))
Trend(#TrueFactsAboutMe,http://twitter.com/search/?q=%23TrueFactsAboutMe)
Trend(#200mFinal,http://twitter.com/search/?q=%23200mFinal)
Trend(Jamaica 1,2,3,http://twitter.com/search/?q=%22Jamaica%201,2,3%22)
Trend(#DontComeToMyHouse,http://twitter.com/search/?q=%23DontComeToMyHouse)
Trend(Lauren Cheney,http://twitter.com/search/?q=%22Lauren%20Cheney%22)
Trend(Silver & Bronze,http://twitter.com/search/?q=%22Silver%20&%20Bronze%22)
Trend(Jammer Martina,http://twitter.com/search/?q=%22Jammer%20Martina%22)
Trend(Japan 2-0,http://twitter.com/search/?q=%22Japan%202-0%22)
Trend(Prata e Bronze,http://twitter.com/search/?q=%22Prata%20e%20Bronze%22)
Trend(Final 200m,http://twitter.com/search/?q=%22Final%20200m%22)

そうそう、ほぼ正しいように見えます。

于 2012-08-09T20:06:34.090 に答える
6

Lift-Jsonを見てください。これは Lift Web フレームワークの一部ですが、スタンドアロンのライブラリとして使用できます。json をケース クラス (およびリストやマップなどのコレクション) に解析でき、注釈を追加する必要はありません。クラスの json としてのレンダリング、および json のマージとクエリもサポートしています。

これは彼らのウェブサイトから取られた例です:

import net.liftweb.json._
implicit val formats = DefaultFormats // Brings in default date formats etc.

case class Child(name: String, age: Int,
                birthdate: Option[java.util.Date])
case class Address(street: String, city: String)
case class Person(name: String, address: Address,
                 children: List[Child])
val json = parse("""
         { "name": "joe",
           "address": {
             "street": "Bulevard",
             "city": "Helsinki"
           },
           "children": [
             {
               "name": "Mary",
               "age": 5
               "birthdate": "2004-09-04T18:06:22Z"
             },
             {
               "name": "Mazy",
               "age": 3
             }
           ]
         }
       """)

json.extract[Person] 
/* Person = Person(joe, Address(Bulevard,Helsinki),
                  List(Child(Mary,5,Some(Sat Sep 04 18:06:22 EEST 2004)), 
                       Child(Mazy,3,None)))
 */
于 2012-08-09T19:49:51.443 に答える
3

Jackson JSON processor を使用することをお勧めします。Java と Scala の両方で機能します。JSON データをネイティブ オブジェクトにマップする方法を説明する注釈をクラスに追加するだけです。

例:

import scala.reflect.BeanProperty
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.annotate._

class User {
  @BeanProperty var gender: String = null
  @BeanProperty var verified: Boolean = false
  @BeanProperty var userImage: Array[Byte] = null
  @BeanProperty var name: Name = null
}

case class Name {
  @BeanProperty var first: String = null;
  @BeanProperty var last: String = null;
}

object Json {
  def main(argv: Array[String]) {
    val input = """{
  "name" : { "first" : "Joe", "last" : "Sixpack" },
  "verified" : false,
  "userImage" : "Rm9vYmFyIQ=="
}""";

    val mapper = new ObjectMapper(); // can reuse, share globally
    val user: User = mapper.readValue(input, classOf[User]);

    print(user.name.first);
  }
}

このソリューションには、すべてのフィールドに で注釈を付ける必要があるという少し手間がかかりますが@BeanProperty、より簡単な方法はわかりません。


注: 私の知る限り、Jackson は を使用せずjavax.bean.Introspector、メソッド自体を調べてゲッター/セッターを見つけようとします。もしそうなら、物事はもっと簡単だったでしょう、ただ書くことができるでしょう

@scala.reflect.BeanInfo
case class Name {
    var first: String;
    var last: String;
}
于 2012-08-09T19:24:54.603 に答える
3

Jerkson lib を試してください: https://github.com/codahale/jerkson/

Jackson をベースにした scala 用の json ライブラリです。2 を再生するために含まれています: http://www.playframework.org/documentation/2.0.2/ScalaJson

例:

    case class Person(id: Long, name: String)
    parse[Person]("""{"id":1,"name":"Coda"}""") //=> Person(1,"Coda")
于 2012-08-10T09:20:27.710 に答える