2013-02-02 7 views
6

tôi đang cố gắng để có được json4s để trích xuất một cái gì đó nhưng tôi nhận được một "lỗi không rõ"JSON4S chưa biết lỗi

Mã của tôi trông giống như:

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]) 

Lỗi Đường dẫn:

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 

tôi chạy SCALA 2.9.2 với json4s 2.9.2: 3.1.0 với trình phân tích cú pháp jackson 2.1.1

trước khi tôi đi đến "json4s" tôi đã thử jackson di trực tiếp và thậm chí không có những ví dụ được cung cấp để làm việc với khai thác vì vậy tôi hình một cái gì đó là tắt ở đây nhưng không rly một đầu mối nơi để bắt đầu tìm kiếm.

Cảm ơn trước sự giúp đỡ :)

Trả lời

0

Tôi đã không thử nó nhưng FAQ Mục @https://github.com/json4s/json4s đề cập:

"Khai thác không làm việc cho lớp được định nghĩa trong REPL Biên soạn các định nghĩa trường hợp lớp học với. scalac và nhập chúng vào REPL. "

9

Trong thực tế, có sự khác biệt khi bạn đặt mã lớp chữ hoa của bạn. Hãy xem xét hai ví dụ:

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

Trường hợp này sẽ có trường ngầm với loại SomeServlet (như lớp Java bên trong không tĩnh) và do đó sẽ không tương ứng với JSON đã cho. Đó là lý do tại sao bạn nhận được một ngoại lệ. Bây giờ hãy xem ví dụ thứ hai:

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

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

Trong lớp ví dụ thứ hai Người hoàn toàn độc lập và do đó không có trường ngầm. Vì vậy, nó sẽ làm việc. Ít nhất là làm việc cho tôi.

+0

Great câu trả lời. Điều này có thể gây hiểu lầm cho những người mới bắt đầu với Scala. Cảm ơn. @Oliver nên chấp nhận câu trả lời này. – Shrayas

+0

Cảm ơn bạn! Điều này chỉ giúp tôi tiết kiệm rất nhiều thời gian. –

0

Vấn đề tương tự. Vấn đề là nơi bạn xác định trường hợp của bạn!

mẫu JSON Input

$.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)