2013-02-02 114 views
6

मैं json4s कुछ निकालने के लिए प्राप्त करने के लिए कोशिश कर रहा हूँ, लेकिन मैं एक "अज्ञात त्रुटि" मिलJSON4S अज्ञात त्रुटि

मेरे कोड लगता है:

import org.json4s._ 
import org.json4s.jackson.JsonMethods._ 
implicit val formats = org.json4s.DefaultFormats 

case class Person(name: String, age: Int) 
val json = """{"name":"joe","age":15}""" 

print(parse(json).extract[Person]) 

त्रुटि पथ:

org.json4s.MappingException: unknown error 
    at org.json4s.Extraction$.extract(Extraction.scala:50) 
    at org.json4s.ExtractableJsonAstNode.extract(ExtractableJsonAstNode.scala:21) 
    at Main$$anon$1.<init>(test.scala:8) 
    at Main$.main(test.scala:1) 
    at Main.main(test.scala) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at scala.tools.nsc.util.ScalaClassLoader$$anonfun$run$1.apply(ScalaClassLoader.scala:78) 
    at scala.tools.nsc.util.ScalaClassLoader$class.asContext(ScalaClassLoader.scala:24) 
    at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.asContext(ScalaClassLoader.scala:88) 
    at scala.tools.nsc.util.ScalaClassLoader$class.run(ScalaClassLoader.scala:78) 
    at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:101) 
    at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:33) 
    at scala.tools.nsc.ObjectRunner$.runAndCatch(ObjectRunner.scala:40) 
    at scala.tools.nsc.ScriptRunner.scala$tools$nsc$ScriptRunner$$runCompiled(ScriptRunner.scala:171) 
    at scala.tools.nsc.ScriptRunner$$anonfun$runScript$1.apply(ScriptRunner.scala:188) 
    at scala.tools.nsc.ScriptRunner$$anonfun$runScript$1.apply(ScriptRunner.scala:188) 
    at scala.tools.nsc.ScriptRunner$$anonfun$withCompiledScript$1.apply$mcZ$sp(ScriptRunner.scala:157) 
    at scala.tools.nsc.ScriptRunner$$anonfun$withCompiledScript$1.apply(ScriptRunner.scala:131) 
    at scala.tools.nsc.ScriptRunner$$anonfun$withCompiledScript$1.apply(ScriptRunner.scala:131) 
    at scala.tools.nsc.util.package$.waitingForThreads(package.scala:26) 
    at scala.tools.nsc.ScriptRunner.withCompiledScript(ScriptRunner.scala:130) 
    at scala.tools.nsc.ScriptRunner.runScript(ScriptRunner.scala:188) 
    at scala.tools.nsc.ScriptRunner.runScriptAndCatch(ScriptRunner.scala:201) 
    at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:58) 
    at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:80) 
    at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:89) 
    at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 
Caused by: java.lang.NoSuchFieldException: MODULE$ 
    at java.lang.Class.getField(Class.java:1520) 
    at org.json4s.Meta$$anonfun$mappingOf$1$$anonfun$8.apply(Meta.scala:208) 
    at org.json4s.Meta$$anonfun$mappingOf$1.apply(Meta.scala:207) 
    at org.json4s.Meta$$anonfun$mappingOf$1.apply(Meta.scala:195) 
    at org.json4s.Meta$Memo.memoize(Meta.scala:240) 
    at org.json4s.Meta$.mappingOf(Meta.scala:195) 
    at org.json4s.Extraction$.mkMapping$1(Extraction.scala:207) 
    at org.json4s.Extraction$.org$json4s$Extraction$$extract0(Extraction.scala:214) 
    at org.json4s.Extraction$.extract(Extraction.scala:47) 
    ... 34 more 

मैं जेएससी 4 एस के साथ स्केल 2.9.2 चलाएं 2.9.2: 3.1.0 जैक्सन पार्सर 2.1.1

इससे पहले कि मैं "json4s" पर गया, मैंने जैक्सन डी की कोशिश की ठीक से और निकासी के साथ काम करने के लिए प्रदान किए गए उदाहरण भी नहीं मिला है, इसलिए मुझे लगता है कि यहां कुछ बंद है, लेकिन एक सुराग नहीं है जहां दिखना शुरू करना है।

धन्यवाद मदद :)

उत्तर

0

के लिए अग्रिम में मैं इसे करने की कोशिश नहीं की है, लेकिन अकसर किये गए सवाल धारा @https://github.com/json4s/json4s का उल्लेख है:

"निष्कर्षण आरईपीएल में परिभाषित वर्गों के लिए काम नहीं करता है के साथ मामला वर्ग परिभाषाओं संकलित करें। स्केलैक और आरईपीएल को आयात करें। "

9

वास्तव में एक अंतर है जहां आप अपना केस क्लास कोड डालते हैं। दो उदाहरणों को देखें:

class SomeServlet { 
def someMethod(json: String) = parse(json).extract[Person] 
case class Person(name: String, age: Int) 
} 

इस मामले वर्ग व्यक्ति में प्रकार SomeServlet (जावा गैर स्थिर भीतरी वर्ग की तरह) के साथ एक अंतर्निहित क्षेत्र होगा और इस प्रकार दिया JSON के अनुरूप नहीं होंगे। यही कारण है कि आप एक अपवाद प्राप्त करते हैं। अब दूसरा उदाहरण देखें:

class SomeServlet { 
def someMethod(json: String) = parse(json).extract[Person] 
} 

case class Person(name: String, age: Int) 

दूसरे उदाहरण में कक्षा व्यक्ति पूरी तरह से स्वतंत्र है और इस प्रकार कोई अंतर्निहित क्षेत्र नहीं है। तो यह काम करना चाहिए। कम से कम मेरे लिए काम करता है।

+0

महान जवाब। यह उन लोगों के लिए भ्रामक हो सकता है जो अभी स्कैला के साथ शुरू कर रहे हैं। धन्यवाद। @ ओलिवर को यह जवाब स्वीकार करना चाहिए। – Shrayas

+0

धन्यवाद! यह सिर्फ मुझे एक टन बचाया। –

0

वही समस्या। समस्या यह है कि आप अपनी केस कक्षा को परिभाषित करते हैं!

नमूना JSON इनपुट

$.ajax({ 
     type: 'POST', 
     url: '', 
     contentType: 'text/plain', 
     data: JSON.stringify(
     {"subject":emailTitle,"body":emailMessage.join('\n')} 
     ), 
     success: function(){ 
     } 
     })  


import org.json4s._  
import org.scalatra.json.JacksonJsonSupport  
class EmailServlet extends ScalatraServlet {  
    post("/contact") {  
    val emailObj =parse(request.body).extract[EmailMessage] 
    SampleEmailService.sendEmail( 
    Email(emailObj.subject , emailObj.body)  
    )  
"ok"  
}  

}

//Outside Servlet definition  
case class EmailMessage(subject:String,body:String)