7

我试图让 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

我使用杰克逊解析器 2.1.1 和 json4s 2.9.2:3.1.0 运行 SCALA 2.9.2

在我去“json4s”之前,我直接尝试了杰克逊,甚至没有提供用于提取的示例,所以我认为这里有些东西是关闭的,但不知道从哪里开始寻找。

提前感谢您的帮助:)

4

3 回答 3

12

实际上,您放置案例类代码的位置有所不同。考虑两个例子:

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

在这种情况下,类 Person 将具有 SomeServlet 类型的隐式字段(如 Java 非静态内部类),因此不会对应于给定的 JSON。这就是为什么你会得到一个例外。现在看第二个例子:

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

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

在第二个示例中,Person 类是完全独立的,因此没有隐式字段。所以它应该工作。至少对我有用。

于 2013-08-31T18:11:00.300 回答
1

同样的问题。问题是你在哪里定义你的案例类!

示例 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)
于 2015-03-06T15:43:56.263 回答
0

我没有尝试过,但常见问题部分@ https://github.com/json4s/json4s提到:

“提取不适用于 REPL 中定义的类。使用 scalac 编译案例类定义并将其导入 REPL。”

于 2013-02-04T18:38:59.893 回答