4

让我先说我是使用 json 和序列化等的新手。我正在尝试从某些案例类中创建一些 json。这是我正在使用的 scala 工作表中的代码:

import net.liftweb.json.DefaultFormats
import net.liftweb.json.Serialization.write
implicit val formats = DefaultFormats

// DBObjectTypes is an enumeration not shown in this snippet.
def update(dbObject: DBObjectTypes, updatePair: Map[String, Any]): Unit = {

  case class Query(objectType: String, id: String, version: Long)
  case class Update($set: Map[String, Any])
  case class QueryUpdate(query: Query, update: Update)
  val queryUpdate = QueryUpdate(Query(dbObject.toString, "test", 1L), Update(updatePair))
  val updateJson = write(queryUpdate)
  println(updateJson)
}
// SRAsubmission is an enumeration not show in this code snippet
update(SRAsubmission, Map("Desc" -> "Foo"))

这会产生以下 JSON:

{"$outer":{},"query":{"$outer":{},"objectType":"SRAsubmission","id":"test","version":1},"update":{"$outer":{},"$set":{"Desc":"Foo"}}}

想要的是如下:

{"query":{"objectType":"SRAsubmission","id":"test","version":1},"update":{"$set":{"Desc":"Foo"}}}

我不明白为什么我得到 $outer: {} json 元素。我很确定这可能是我不理解但无法在 StackOverflow 或 Google 上找到任何答案的基本问题。提前感谢您的帮助!

4

3 回答 3

3

将您的案例类定义移到 def 之外。外部是对它们重新定义的类的实例的引用。

于 2017-03-04T07:03:10.077 回答
2

+1 克里斯托夫

我也有这个问题,将我的案例类移出我的逻辑类。

import ...
class clsMakeJsonFile {...}


//Case classes
case class humanBeing(height: Int, name: String, isSuperHuman: Boolean)
case class parents(names: String, nationality: String, isAlive: Boolean)
case class children(count: Int, names: String, canCode: Boolean)
于 2019-07-24T09:24:13.697 回答
-1

你的案例类应该在对象和主类之间,否则你会得到外部。你也应该从主类调用方法。还添加了隐式声明。试试这样,如果您有任何问题,请告诉我。

注意:我没有测试过这段代码。

object AdvJson {

  case class Query(objectType: String, id: String, version: Long)
  case class Update($set: Map[String, Any])
  case class QueryUpdate(query: Query, update: Update)

  def main(args: Array[String]) {

    update(SRAsubmission, Map("Desc" -> "Foo"))

    def update(dbObject: DBObjectTypes, updatePair: Map[String, Any]): Unit = {

      implicit val format = DefaultFormats
      val queryUpdate = QueryUpdate(Query(dbObject.toString, "test", 1L), Update(updatePair))
      val updateJson = write(queryUpdate)
      println(updateJson)
    }
  }
}
于 2018-03-16T18:11:41.110 回答