2013-01-08 7 views
11

मैं नए Play 2.1-RC1 ढांचे का उपयोग कर रहा है और मैं, कुछ इस तरह एक वर्ग एक विकल्प [] क्षेत्र है कि है:कैसे खेलने में JSON पार्स में वैकल्पिक फ़ील्ड को संभालने के लिए 2.1

import play.api.libs.json._ 
import play.api.libs.json.util._ 
import play.api.libs.json.Reads._ 
import play.api.libs.json.Writes._ 
import play.api.libs.json.Format._ 
import play.api.libs.functional.syntax._ 

case class Test(name: String, value: Option[String]) 

object Test { 
    implicit val testFormat = (
    (__ \ "name").format[String] and 
    (__ \ "value").format[Option[String]] 
)(Test.apply, unlift(Test.unapply)) 
    def fromJson(js: String): Test = { 
    Json.fromJson[Test](Json.parse(js)).fold(
     valid = { t => t}, 
     invalid = { e => { 
      val missingField = (e(0)._1).toString.substring(1) 
      val badJs = js.trim 
      val newJs = badJs.substring(0, badJs.length()-1)+",\""+missingField+"\":null}" 
      fromJson(newJs) 
     }} 
    ) 
    } 
} 

मैं जेएसओएन तारों को संभालने में सक्षम होना चाहते हैं जो वैकल्पिक "मान" डेटा को छोड़ देते हैं, उदाहरण के लिए

val y = """{"name":"someone"}""" 

(संपादित प्रश्न) मैं json स्ट्रिंग (बल्कि अनाड़ीपन से) को फिर से लिखने के रूप में मान्यता कदम में दिखाया गया है, लेकिन वहाँ एक सरल पैटर्न मैं वैकल्पिक फ़ील्ड लापता के लिए कोई भी आपूर्ति करने के लिए उपयोग कर सकते हैं? ध्यान दें कि यह पुनर्लेख नेस्टेड संरचनाओं, या कहीं भी जहां मैं लापता क्षेत्र को बस जोड़ नहीं सकता हूं, के साथ काम नहीं करता है।

उत्तर

6

आप बस कर सकते हैं:

import play.api.libs.json._ 
import play.api.libs.functional.syntax._ 

case class Test(name: String, value: Option[String]) 

implicit val testFormat = Json.format[Test] 

def hoge = Action(Json.parse.json) { request => 
    Json.fromJson[Test](request.body) 
    ... 
} 
+0

एकमात्र समस्या यह है कि जेसन अनुरोध से नहीं आ रहा है लेकिन वेबसाईट से। – NickStoughton

+0

@ निकस्टॉटन 'Iteratee.foreach [जेएसवेल्यू] (घटना => जेसन.फ्रॉमजसन [टेस्ट] (घटना)) ' – sndyuk

+0

@ निकस्टॉफ्टन जेएफवाईआई https://github.com/playframework/Play20/blob/master/samples/scala/websocket -चैट/ऐप/मॉडल/ChatRoom.scala – sndyuk

3

ठीक है ... इसलिए इस सवाल का जवाब बहुत सरल है। वैकल्पिक क्षेत्रों के लिए

fomatOpt() 

का उपयोग करें। तो परीक्षण फॉर्मेटर अब इस तरह दिखता है:

import play.api.libs.json._ 
import play.api.libs.json.util._ 
import play.api.libs.json.Reads._ 
import play.api.libs.json.Writes._ 
import play.api.libs.json.Format._ 
import play.api.libs.functional.syntax._ 

case class Test(name: String, value: Option[String]) 

object Test { 
    implicit val testFormat = (
    (__ \ "name").format[String] and 
    (__ \ "value").formatOpt[String] 
)(Test.apply, unlift(Test.unapply)) 

    def fromJson(js: String): Test = { 
    Json.fromJson[Test](Json.parse(js)).fold(
     valid = { t => t}, 
     invalid = { e => { 
     println("BAD JSON!") 
     null 
     }} 
    ) 
    } 
} 
+2

पढ़ना/लिखने/प्रारूप इंजेक्शन के लिए स्कैला मैक्रोज़ का उपयोग करते समय मामले के बारे में क्या? उदाहरण के लिए हम आपके मामले में केवल 'अंतर्निहित वैल टेस्टफॉर्मैट = जेसन.फॉर्मैट [टेस्ट]' लिख सकते हैं कि आप उस मामले में वैकल्पिक JSON मान कैसे प्रबंधित कर सकते हैं? – visionary

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