2014-04-24 7 views
11

के मैं निम्नलिखित सेटअप के साथ एक मामले वर्ग है मान लेते हैं:संयोजन प्रकार और क्षेत्र serializers

case class Place(id:java.util.UUID, name:String) 

मैं इस प्रकार इस प्रकार के लिए एक (! काम) serializer लिख सकते हैं:

class placeSerializer extends CustomSerializer[Place](format => (
     { 
      case JObject(JField("id", JString(s)) :: JField("name",JString(x)) :: Nil) => 
       Place(UUID.fromString(s), x) 
     }, 
     { 
      case x:Place => 
       JObject(
        JField("id", JString(x.id.toString())) :: 
        JField("name", JString(x.name)) :: Nil) 
     } 
     ) 
    ) 

लेकिन मान लीजिए कि मेरे केस क्लास में अंततः बहुत अधिक फ़ील्ड हैं, इससे मुझे एएसटी के साथ ऑब्जेक्ट की पूरी संरचना का आकलन करना पड़ सकता है, जो कुछ प्राइमेटिव को एन्कोड करने के लिए बहुत ही वर्बोज़ बनाता है।

json4s में फ़ील्ड सीरियलाइज़र होते हैं जो केवल विशिष्ट फ़ील्ड पर कार्य कर सकते हैं, बॉयलरप्लेट विधियों को नामों को आसानी से बदलने और फ़ील्ड को त्यागने के लिए शामिल किया गया है। ये है, तथापि, उनके serialize और deserialize आंशिक कार्यों के लिए निम्न हस्ताक्षर है:

case class FieldSerializer[A: Manifest](
    serializer: PartialFunction[(String, Any), Option[(String, Any)]] = Map(), 
    deserializer: PartialFunction[JField, JField] = Map() 
) 

JField के बाद से (प्रकार है कि एक प्रमुख representes -> json से वैल) अपने स्वयं के प्रकार और नहीं JValue का एक उपवर्ग है, id कुंजी को अपने नाम से UUID पर सही ढंग से एन्कोड करने के लिए इन दो प्रकार के धारावाहिकों को कैसे जोड़ सकते हैं, जबकि अन्य क्षेत्रों (जो आदिम डेटाटाइप हैं) के डिफ़ॉल्ट हैंडलिंग को बनाए रखते हैं।

अनिवार्य रूप से मुझे एक प्रारूप श्रृंखला चाहिए जो Place के भीतर फ़ील्ड को समझती है, यूयूआईडी है, बिना DefaultFormats सभी क्षेत्रों के लिए एएसटी संरचना निर्दिष्ट किए बिना।

जो मैं विशेष रूप से ढूंढ रहा हूं वह JSONEncoder and JSONDecoder interfaces in python के समान पैटर्न की नकल करना है, जो फ़ील्ड के लिए marshalling को संभालने के तरीके को निर्धारित करने के लिए कुंजी नाम के साथ ही मूल्य प्रकार का उपयोग कर सकते हैं।

+6

टिप्पणियों के बिना डाउनवोट्स मुझे उदास बनाते हैं :( – DeaconDesperado

+0

यह भी जांचें http://stackoverflow.com/questions/23977779/is-there-an-out-of-the-box-format-for-uuid-in-json4s के लिए यूयूआईडी विशिष्ट मुद्दा – iwein

उत्तर

5

चाल अपने प्रकार के लिए एक serializer नहीं लिखने के लिए है, लेकिन प्रकार है कि आप अंदर उपयोग कर रहे हैं (इस मामले java.util.UUID में) के लिए

तो फिर तुम टूलबॉक्स में है कि serializer जोड़ सकते हैं और तब से किसी भी प्रकार का उपयोग कर UUID प्रकार की तरह बिल्कुल उसी तरह काम DefaultSerializer समर्थित फ़ील्ड का उपयोग होगा किया:

case object UUIDSerialiser extends CustomSerializer[UUID](format => (
    { 
     case JString(s) => UUID.fromString(s) 
     case JNull => null 
    }, 
    { 
     case x: UUID => JString(x.toString) 
    } 
) 
) 

implicit val json4sFormats = Serialization.formats(NoTypeHints) + UUIDSerialiser 

अद्यतन लिंक the PR upda करने

ते 2 पीआर विलय हो गया है, और अब, UUID के मामले में आप का उपयोग कर सकते हैं:

import org.json4s.ext.JavaTypesSerializers 

implicit val json4sFormats = Serialization.formats(NoTypeHints) ++ JavaTypesSerializers.all 
+0

धन्यवाद @ इवेन! अभी भी प्रत्यारोपण के जादू के लिए उपयोग किया जा रहा है ... पुरानी अनिवार्य आदतों को तोड़ना मुश्किल है। – DeaconDesperado

+0

@DeaconDesperado – iwein

10

अब एक UUID json4s का अतिरिक्त पैकेज में प्रदान की serializer है। यह संभवतः संस्करण 3.2.11 में उपलब्ध होगा (जिसे इस लेखन के रूप में जारी नहीं किया गया है)।

आप इस तरह कुछ करने के लिए सक्षम हो जाएगा:

import org.json4s.ext.JavaTypesSerializers 

implicit val json4sFormats = Serialization.formats(NoTypeHints) ++ JavaTypesSerializers.all 

यह from the tests for this feature's PR लिया गया था।

+0

मदद करने में प्रसन्नता हो रही है जब मुझे अपने पुल अनुरोधों को विलय करने वाले किसी के द्वारा पुराना जवाब मिलता है :) अच्छा लगता है, मुझे आशा है कि आपको बुरा नहीं लगता कि मैंने नई वास्तविकता को दर्शाने के लिए अपना जवाब अपडेट किया है। – iwein

+0

बीटीडब्ल्यू, परीक्षण का लिंक टूटा हुआ है, आप बस पुल अनुरोध से लिंक कर सकते हैं जैसे मैंने किया: https://github.com/json4s/json4s/pull/130/files – iwein

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