首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spray.json.DeserializationException:期望列表为JsArray?

spray.json.DeserializationException:期望列表为JsArray?
EN

Stack Overflow用户
提问于 2016-01-31 01:30:54
回答 1查看 2.7K关注 0票数 1

我正在使用spray-json,这就是我要做的

代码语言:javascript
复制
import java.io.File

import spray.json._

import scala.io.Source

case class WorkConfig(configName: String,
                      logSource: String,
                      logType: String,
                      afterProcessingFileAction: String,
                      recursiveFind: Boolean = false,
                      processZipFiles: Boolean = false) {
}

object WorkConfigParser {

  object WorkOrderItemJsonProtocol extends DefaultJsonProtocol {
    implicit val workOrderItemFormat = jsonFormat6(WorkConfig.apply)
  }


  def get(workOrderJson: File): List[WorkConfig] = {
    import WorkOrderItemJsonProtocol._
    val json: JsValue = Source.fromFile(workOrderJson).mkString.toJson
    json.convertTo[List[WorkConfig]]
  }

  def main(args: Array[String]) {
    val items: List[WorkConfig] = WorkConfigParser.get(new File("resources/workConfigSample.json"))
    items.foreach((x: WorkConfig) => println(x.afterProcessingFileAction))
  }
}

当我运行这段代码时,我看到

代码语言:javascript
复制
Exception in thread "main" spray.json.DeserializationException: Expected List as JsArray, but got "[\n  {\n    \"configName\": \"bluecoat\",\n    \"logSource\": \"/root/fw1/logs/bc\",\n    \"logType\": \"bluecoat\",\n    \"recursiveFind\": true,\n    \"processZipFiles\": false,\n    \"afterProcessingFileAction\": \"delete\"\n  },\n  {\n    \"configName\": \"mcAfee\",\n    \"logSource\": \"/root/fw1/logs/mcafee\",\n    \"logType\": \"mcafee\",\n    \"recursiveFind\": true,\n    \"processZipFiles\": true,\n    \"afterProcessingFileAction\": \"delete\"\n  }\n]\n\n\n"
    at spray.json.package$.deserializationError(package.scala:23)
    at spray.json.CollectionFormats$$anon$1.read(CollectionFormats.scala:29)
    at spray.json.CollectionFormats$$anon$1.read(CollectionFormats.scala:25)
    at spray.json.JsValue.convertTo(JsValue.scala:31)
    at com.logprocessor.inputs.WorkConfigParser$.get(WorkConfig.scala:27)
    at com.logprocessor.inputs.WorkConfigParser$.main(WorkConfig.scala:31)
    at com.logprocessor.inputs.WorkConfigParser.main(WorkConfig.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

这里出什么事了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-31 07:52:22

--您使用的是toJson而不是parseJson. --将json字符串转换为JsValue应该使用parseJson。

代码语言:javascript
复制
@ val w = WorkConfig("a","b","c","d")

w: WorkConfig = WorkConfig("a", "b", "c", "d", false, false)

@ val l = List(w,w)

l: List[WorkConfig] = List(WorkConfig("a", "b", "c", "d", false, false),
WorkConfig("a", "b", "c", "d", false, false))

@ l.toJson.toString
res48: String = """
[{"configName":"a","logType":"c","recursiveFind":false,
"processZipFiles":false,"afterProcessingFileAction":"d","logSource":"b
{"configName":"a","logType":"c","recursiveFind":false,
"processZipFiles":false,"afterProcessingFileAction":"d","logSource":"b"}]
"""

@ res48.parseJson
res49: JsValue =  [{"configName":"a","logType":"c","recursiveFind":false,
"processZipFiles":false,"afterProcessingFileAction":"d","logSource":"b
{"configName":"a","logType":"c","recursiveFind":false,
"processZipFiles":false,"afterProcessingFileAction":"d","logSource":"b"}]

@ res49.convertTo[List[WorkConfig]]
res50: List[WorkConfig] = List(WorkConfig("a", "b", "c", "d", false,
false), WorkConfig("a", "b", "c", "d", false, false))
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35109335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档