我试图让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我使用json4s 2.9.2:3.1.0和jackson解析器2.1.1运行SCALA 2.9.2。
在我转到"json4s“之前,我直接尝试了jackson,甚至没有得到所提供的用于提取的示例,所以我认为这里有问题,但并不是从哪里开始寻找的线索。
提前感谢您的帮助:)
发布于 2013-09-01 02:11:00
事实上,您放置case类代码的位置是不同的。考虑两个示例:
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类是完全独立的,因此没有隐式字段。所以它应该是可行的。至少对我来说是可行的。
发布于 2015-03-06 23:43:56
同样的问题。问题是你在哪里定义你的case类!
示例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)发布于 2013-02-05 02:39:00
我还没有尝试过,但是FAQ部分@ https://github.com/json4s/json4s提到:
“提取不适用于REPL中定义的类。请使用scalac编译case类定义,然后将其导入REPL。”
https://stackoverflow.com/questions/14661811
复制相似问题