2015-01-08 7 views
10

का उपयोग कर जेसन स्ट्रिंग को कॉम्पैक्ट करने के लिए मैं वर्तमान में विभिन्न डेटा स्रोतों से कुछ मीट्रिक निकालने और Map[String,Any] के मानचित्र में संग्रहीत कर रहा हूं जहां कुंजी मीट्रिक नाम से मेल खाती है और मान मीट्रिक मान से मेल खाता है । मुझे इसे कम या ज्यादा सामान्य होने की आवश्यकता है, जिसका अर्थ है कि मूल्य प्रकार आदिम प्रकार या प्राचीन प्रकार की सूचियां हो सकते हैं।मानचित्र [स्ट्रिंग, कोई भी] json4s

मैं इस मानचित्र को JSON- स्वरूपित स्ट्रिंग में क्रमबद्ध करना चाहता हूं और इसके लिए मैं json4s लाइब्रेरी का उपयोग कर रहा हूं। बात यह है कि यह संभव प्रतीत नहीं होता है और मुझे इसके लिए एक संभावित समाधान नहीं दिख रहा है। मैं की तरह बॉक्स :)

val myMap: Map[String,Any] = ... // extract metrics 
val json = myMap.reduceLeft(_ ~ _) // create JSON of metrics 

source code के माध्यम से नेविगेट मैं json4s देखा है से बाहर काम करने के लिए निम्न क्रम JValue के लिए आदिम प्रकार बदलने के लिए में निहित रूपांतरण प्रदान करता है कुछ उम्मीद होती है और यह भी JValue को Traversable[A]/Map[String,A]/Option[A] कन्वर्ट करने के लिए (A से JValue तक एक अंतर्निहित रूपांतरण उपलब्ध होने के प्रतिबंध के तहत, जिसे मैं समझता हूं वास्तव में इसका अर्थ है A एक आदिम प्रकार है)। ~ ऑपरेटर JObjectJField के बाहर बनाने का एक अच्छा तरीका प्रदान करता है, जो (String, JValue) के लिए केवल एक प्रकार का उपनाम है।

इस मामले में, नक्शा मूल्यों प्रकार Any है, इसलिए अंतर्निहित रूपांतरण जगह नहीं लेते हैं और इसलिए संकलक निम्न त्रुटि फेंकता है:

    value ~ is not a member of (String, Any) 
[error]    val json = r.reduceLeft(_ ~ _) 

वहाँ मैं क्या हासिल करना चाहते हैं के लिए एक समाधान है?

+0

यदि मैं आपको सही ढंग से समझता हूं और आप केवल 'myMap' को क्रमबद्ध करना चाहते हैं, तो' Serialization.write (myMap) 'को सीधे क्यों नहीं कॉल करें? – edi

+1

@ user3567830 मैं 'myMap' का JSON स्ट्रिंग प्रस्तुति चाहता हूं, जो कि JSON स्कैला लाइब्रेरी जैसे' json4s' – jarandaf

+1

हां, 'org.json4s.jackson.Serialization.write (myMap) 'का उपयोग करने का उद्देश्य है। (मैंने json4s के जैक्सन संस्करण का उपयोग किया, लेकिन यह देशी संस्करण के लिए भी काम करना चाहिए)। – edi

उत्तर

26

चूंकि आप वास्तव में केवल myMap के JSON स्ट्रिंग प्रस्तुति की तलाश में हैं, तो आप सीधे Serialization ऑब्जेक्ट का उपयोग कर सकते हैं। यहाँ (यदि json4s के मूल संस्करण का उपयोग कर org.json4s.native.Serialization करने के लिए आयात को बदलने) एक छोटा सा उदाहरण है:

संपादित: formats निहित

import org.json4s.jackson.Serialization 

implicit val formats = org.json4s.DefaultFormats 

val m: Map[String, Any] = Map(
    "name "-> "joe", 
    "children" -> List(
    Map("name" -> "Mary", "age" -> 5), 
    Map("name" -> "Mazy", "age" -> 3) 
    ) 
) 
// prints {"name ":"joe","children":[{"name":"Mary","age":5},{"name":"Mazy","age":3}]} 
println(Serialization.write(m)) 
+3

बस आगे के संदर्भ के लिए, एक निहित 'प्रारूप' उदाहरण आवश्यक है, अन्यथा निम्न त्रुटि दिखाई देती है: 'कोई org.json4s.Formats नहीं मिला। Org.json4s का उदाहरण लाने का प्रयास करें। स्कोप में फ़ार्मेट्स या org.json4s.DefaultFormats.' का उपयोग करें। उदाहरण के लिए, 'अंतर्निहित वैल प्रारूप = org.json4s.DefaultFormats' समस्या हल करता है। – jarandaf

+0

धन्यवाद, मैंने जवाब अपडेट किया है। – edi

0

json4s इसके लिए विधि है जोड़ा।

pretty(render(yourMap)) 
संबंधित मुद्दे