2012-07-08 15 views
5

के साथ एक कुंजी के रूप में एक स्ट्रिंग नहीं है, ऐसा लगता है जैसे लिफ्ट-जेसन उन मानचित्रों तक ही सीमित है जिनमें स्ट्रिंग्स के रूप में स्ट्रिंग्स हैं।लिफ्ट-जेसन

इस सीमा को बाईपास करने का सबसे अच्छा तरीका क्या है?

+0

क्या JSON ऑब्जेक्ट्स केवल कुंजी के लिए तार नहीं हैं? –

+0

हां, JSON ऑब्जेक्ट्स केवल कुंजी के लिए तारों तक ही सीमित हैं। वे एक व्यावहारिक मामले के रूप में, विधि नाम हैं, इसलिए यह उपयुक्त है। –

+0

हां, मेरा सवाल यह था कि आप (डी) मानचित्र को क्रमबद्ध कैसे कर सकते हैं जो इस सीमा के बाद कुंजी के रूप में स्ट्रिंग नहीं कर रहा है। – Atol

उत्तर

5

अपना खुद का Serializer[Map[Any, Any]] परिभाषित करें।

import net.liftweb.json._ 
import ext._ 

object MapSerializer extends Serializer[Map[Any, Any]] { 
    def serialize(implicit format: Formats): PartialFunction[Any, JValue] = { 
    case m: Map[_, _] => JObject(m.map({ 
     case (k, v) => JField(
     k match { 
      case ks: String => ks 
      case ks: Symbol => ks.name 
      case ks: Any => ks.toString 
     }, 
     Extraction.decompose(v) 
    ) 
    }).toList) 
    } 

    def deserialize(implicit format: Formats): PartialFunction[(TypeInfo, JValue), Map[Any, Any]] = { 
    sys.error("Not interested.") 
    } 
} 

फिर इसे Formats चर के लिए जोड़ें।

implicit val formats = DefaultFormats + MapSerializer 

यह सब कुछ है।

0

पिछले जवाब के अलावा आप के बजाय परिभाषित कर सकते हैं:

डीईएफ़ deserialize (अंतर्निहित प्रारूप: प्रारूप): PartialFunction [(TypeInfo, JValue), मानचित्र [कोई भी, किसी भी]] = { मानचित्र() }

यह किसी भी अन्य कामकाजी मानचित्र deserialization तोड़ नहीं है।