2014-11-21 20 views
5

के विभिन्न दृश्य प्रस्तुत करने के लिए Play JSON के साथ एकाधिक राइट्स का उपयोग करके मैं एक प्ले 2.3 एप्लिकेशन लिख रहा हूं जो मैक्सोड द्वारा समर्थित JSON परोसता है। डेटाबेस से आने वाले कुछ दस्तावेज़ संवेदनशील फ़ील्ड होते हैं। मैं इन दस्तावेजों के सर्वर पक्ष के साथ काम करने में सक्षम होना चाहता हूं लेकिन ग्राहकों को सीमित JSON व्यू भेजना चाहता हूं। रीड/राइट्स संयोजक पर प्रलेखन अंतर्निहित पढ़ना और लिखना परिभाषित करता है जो डेटाबेस से डेटा भेजने के लिए ठीक काम करता है लेकिन मेरी आवश्यकताओं को पूरी तरह से भरता नहीं है।किसी ऑब्जेक्ट

मैं जो करना चाहता हूं वह किसी भी अतिरिक्त लेखन को परिभाषित करता है जिसे मैं विशेष रूप से रूपांतरणों या ग्राहकों के मॉडल के सबसेट भेजने के लिए जेसन "विचार" जैसे उपयोग कर सकता हूं। रेल में मैं इस उद्देश्य के लिए जेबिल्डर का उपयोग करता हूं।

toJson पर एक अलग लिखने को स्पष्ट रूप से पास करने का प्रयास करने से मुझे अपेक्षित व्यवहार नहीं मिलता है।

def listUsers = Action.async { 
    val testCustomWrite: Writes[User] = (
     (__ \ "id").write[String] and 
     (__ \ "username").write[String]) { user: User => 
     (user._id.toString(), user.username) 
     } 

    UserDao.findAll().map { 
     case Nil => Ok(Json.toJson("")) 
     case users => Ok(Json.toJson(users)(testCustomWrite)) 
    } 
    } 

यह

type mismatch; 
[error] found : play.api.libs.json.Writes[models.User] 
[error] required: play.api.libs.json.Writes[List[models.User]] 
[error]  case users => Ok(Json.toJson(users)(testCustomWrite)) 

साथ जिस तरह से toJson हैंडल वस्तुओं की एक सूची लेखन एक पर निर्भर करता है संकलन करने में विफल रहता है: इस सरल नियंत्रक कार्रवाई, जो सभी उपयोगकर्ता आईडी और उपयोगकर्ता नामों की JSON सारणी लिखना चाहिए ले लो अंतर्निहित सरणी के लिए लेखक जो एक प्रकार के लिए निहित लेखक पर निर्भर करता है। मैं उपरोक्त को val testCustomWrite: Writes[List[User]] होने के लिए फिर से लिख सकता हूं लेकिन यह सही समाधान की तरह नहीं लगता है क्योंकि Play पहले से लिखने के लिए एक सरणी रैपर प्रदान करता है।

क्या प्ले 2 में एकाधिक JSON "विचार" प्रस्तुत करने का कोई पसंदीदा तरीका है?

उत्तर

6

स्पष्ट रूप से Writes पारित करते समय, प्रकार को मिलान करना होगा। इस मामले में आप Writes.list का उपयोग कर सकते हैं:

Json.toJson(users)(Writes.list(testCustomWrite)) 
+0

आह, धन्यवाद। मैं अभी भी स्कैला के लिए बहुत नया हूं इसलिए मुझे याद आया। मॉडल में जेएसओएन "विचार" को प्ले 2 में सर्वोत्तम/मानक पैटर्न को परिभाषित करने के लिए आपकी राय में कई अलग-अलग लेखन हैं? – imagio

+0

@imagio मैं आमतौर पर प्रति वर्ग एकाधिक पढ़ने/लिखता नहीं है, लेकिन कभी-कभी यह आवश्यक है। उदाहरण के लिए, अगर किसी को क्रमबद्ध होने से पहले कुछ जानकारी छीननी पड़ती है, या शायद अतिरिक्त जानकारी जोड़ी गई है। –

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