2013-08-22 10 views
5

मेरे पास एक उपयोग केस है जहां मुझे शून्य मान स्वीकार करने की आवश्यकता है, लेकिन गुणों को याद नहीं है। इस प्ले फ्रेमवर्क 2.1.3स्कैला जेसन लापता संपत्ति बनाम शून्य

पर है उदाहरण के लिए:

case class Foo(a: Option[String], b: Option[String], c: Option[String]) 

इस मामले में वर्ग एक बड़ा मामला वर्ग

मैं निम्नलिखित स्वीकार करते हैं और foo वस्तु उत्पन्न करने के लिए चाहते हैं का हिस्सा हो सकता :

{ 
    "foo" : { 
     "a" : "blah", 
     "b" : null, 
     "c" : "blah" 
    } 
} 

लेकिन इस:

{ 
    "foo" : { 
     "a" : "blah", 
     "c" : "blah" 
    } 
} 

वर्तमान में मैं मामले वर्ग में JSON पढ़ने के लिए निम्नलिखित है:

val FooReader = (
    (__ \ "a").readNullable[Setting] and 
    (__ \ "b").readNullable[String] and 
    (__ \ "c").readNullable[String])(Foo) 

मैं कैसे FooReader संपत्ति लापता पर JsError उत्पन्न लेकिन अशक्त की अनुमति देने के कर सकते हैं?

उत्तर

5

आप की तरह कुछ का उपयोग कर सकते हैं:

val FooReader = (
    (__ \ "a").readNullable[String] and 
    (__ \ "b").read(Reads.optionNoError[String]) and 
    (__ \ "c").readNullable[String] 
)(Foo) 

'Reads.optionNoError [स्ट्रिंग]' एक JsError अगर '(__ \ "ख")' याद आ रही है का उत्पादन करेगा।

आप वास्तव में की तरह कुछ कर सकते हैं: के साथ मेरे लिए पूरी तरह से

val FooReader = (
    (__ \ "a").read(Reads.optionNoError[String]) and 
    (__ \ "b").read(Reads.optionNoError[String]) and 
    (__ \ "c").read(Reads.optionNoError[String]) 
)(Foo) 
+0

काम करता है:। 'वैल FooReader = ( (__ \" एक ") पढ़ा (Reads.optionNoError [स्ट्रिंग]) और (__ \ "बी")। पढ़ें (Reads.optionNoError [स्ट्रिंग]) और (__ \ "सी")। पढ़ें (Reads.optionNoError [स्ट्रिंग]) ) (Foo) ' –

+0

हाँ, यह अब मेरे लिए काम करता है:) मुझे लगता है कि जब मैं साथी ऑब्जेक्ट फू के अंदर फू बनाने की कोशिश करता हूं तो यह भ्रमित हो जाता है। यह तब काम करता है जब मैं स्पष्ट रूप से –

+0

लागू करता हूं, मेरे पास एक उपयोग केस है जहां किसी जेसन में मूल ऑब्जेक्ट में मौजूद सभी फ़ील्ड मौजूद नहीं हो सकते हैं, और कुछ स्ट्रिंग फ़ील्ड्स जो 'शून्य' हो सकते हैं जिन्हें सत्यापित करना चाहिए और मूल ओबेक्ट के फ़ील्ड को सेट करना चाहिए शून्य। ऐसा करने का प्रत्यक्ष तरीका प्रतीत नहीं होता है। – Ashesh

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