2012-08-09 13 views
11

में परिवर्तित करने के लिए कैसे करें मेरी समस्या यह है कि मुझे कहने से एक JSON टेक्स्ट प्राप्त होता है, ट्विटर। फिर मैं इस पाठ को स्कैला में मूल वस्तु में परिवर्तित करना चाहता हूं। क्या ऐसा करने के लिए एक मानक तरीका है? मैं भी उपयोग कर रहा हूँ प्ले 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

+1

की [मैं का निर्माण और स्काला/लिफ्ट में JSON स्ट्रिंग पार्स कर सकते हैं कैसे] संभव डुप्लिकेट (http://stackoverflow.com/questions/927983/how-can-i-construction-and-parse-a-json-string-in-scala-lift) –

+0

जेर्कसन और कुछ अन्य कम ज्ञात पुस्तकालय भी हैं –

+1

@ ओम-नाम-नाम: मुझे यह नहीं लगता एक डुप्लिकेट के रूप में गिना जाता है- दूसरा सवाल विशेष रूप से लिफ्ट के बारे में है, न खेलें (और बिल्कुल प्राचीन है, वैसे भी)। –

उत्तर

4

मैं व्यक्तिगत रूप से lift-json पसंद करते हैं, लेकिन यह Play's JSON library के साथ ऐसा करना बहुत आसान है:

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) 

तो हाँ, सही दिखता है।

3

मैं Jackson JSON processor उपयोग करने के लिए सुझाव है से सभी प्रवृत्तियों नाम प्राप्त करना चाहते है। यह जावा और स्कैला दोनों के लिए काम करता है। आप बस अपनी कक्षाओं में एनोटेशन जोड़ते हैं जो वर्णन करते हैं कि आप 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 साथ हर क्षेत्र पर टिप्पणी करने के लिए है कि है, लेकिन मैं एक बहुत ही सरल तरीका पता नहीं है।


टिप्पणी: जहाँ तक मुझे पता है, जैक्सन javax.bean.Introspector उपयोग नहीं करता है, यह अपने आप में तरीकों का परीक्षण करके getters/setters खोजने की कोशिश करता। यदि यह किया था, चीजों को आसान होता है, यह लिखने के लिए सिर्फ

@scala.reflect.BeanInfo 
case class Name { 
    var first: String; 
    var last: String; 
} 
3

Lift-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))) 
*/ 
3

Jerkson lib का प्रयास करें: https://github.com/codahale/jerkson/

यह जैक्सन के आधार पर स्केला के लिए एक 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") 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^