2013-04-14 6 views
7

चलाएं मैं एक सशर्त परिवर्तन प्राप्त करने के लिए प्ले 2.1 जेएसओएन रीड का उपयोग कर रहा हूं।जेएसओएन वैकल्पिक ट्रांसफार्मर

मेरे पास एक जेसन ऑब्जेक्ट है और मैं एक वैकल्पिक फ़ील्ड को \ n वर्णों को हटाने के लिए बदलना चाहता हूं। समस्या यह है कि अगर मैं भेजे गए JSON से सामग्री को हटा देता हूं, तो मुझे एक सत्यापन त्रुटि प्राप्त होती है।

यह फ़ील्ड वैकल्पिक है और मुझे नहीं पता कि परिवर्तन कैसे वैकल्पिक है इसका वर्णन करना है। यह वर्तमान सामग्री परिवर्तन है:

 val transformContent = (__ \ 'content).json.update(__.read[JsString].map{ 
     value => 
     JsString(value.value.replaceAll("\n", "")) 
    }) 

मैं एक वैकल्पिक फ़ील्ड परिवर्तन कैसे प्राप्त कर सकते हैं? क्या मुझे Reads.verifyingIf का उपयोग करना चाहिए?

धन्यवाद

उत्तर

8

आप ऐसा कर सकते हैं:

val json = Json.obj("whatever" -> 1, "content" -> "hello world") 
val json2 = Json.obj("whatever" -> 1) 

val transformer = (__ \ 'content).json.update(
    __.readOpt[JsString].map{ 
    case Some(JsString(str)) => JsString(str.replaceAll("world", "scala")) 
    } 
).orElse(__.json.pick[JsObject]) 

json.transform(transformer) 
//JsSuccess({"whatever":1,"content":"hello scala"},) 
json2.transform(transformer) 
//JsSuccess({"whatever":1},) 

लिटिल hacky है, लेकिन यह काम करता है।

+1

'readOpt' बहिष्कृत (संस्करण 2.1-आरसी 2 के बाद से) 'readNullable [T]' का उपयोग करें (जो गायब और शून्य फ़ील्ड दोनों का प्रबंधन करता है) – HEX

2

कुछ साल बाद मैं इसे काम करने के लिए कुछ चीजें बदलना पड़ा:

val json = Json.obj("whatever" -> 1, "content" -> "hello world") 
val json2 = Json.obj("whatever" -> 1) 

val transformer = (__ \ 'content).json.update(
    __.read[JsString].map { 
    case JsString(str) => JsString(str.replaceAll("world", "scala")) 
    } 
).orElse(__.json.pick[JsObject]) 

json.transform(transformer) 
//JsSuccess({"whatever":1,"content":"hello scala"},) 
json2.transform(transformer) 
//JsSuccess({"whatever":1},) 

पढ़ने में विफल रहता है, तो स्ट्रिंग, मौजूद नहीं है इस प्रकार orElse तरीकों JsError Handels।

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