【问题标题】:Json4s producing weird JsonJson4s 产生奇怪的 Json
【发布时间】:2014-02-11 05:14:11
【问题描述】:

这就是我所拥有的:

(("foo" ->
  ("bar" -> 5) ~
  ("bar2" -> 5)) ~
 ("something" -> "else"))

这是我得到的:

[
  {
   "foo": {
      "bar": 5,
      "bar2": "5"
   },
   "something": "else",
  }
]

但这是我想要回来的:

{
   "foo": {
      "bar": 5,
      "bar2": "5"
    },
    "something": "else",
}

我在这里做错了什么?


细节

def getAll: JValue = db withSession { implicit db: Session =>
    // getUsersQuery fetchs all users
    getUsersQuery.list.map { u =>

       ("foo" ->
       ("bar" -> 5) ~
       ("bar2" -> 5)) ~
       ("something" -> "else")

    }
}

【问题讨论】:

    标签: json scala scalatra json4s


    【解决方案1】:

    您的问题有误:

    这就是我所拥有的:

    其实你没有一个JObject,而是一个JObject的集合:

    val jObject = (
      ("foo" ->
        ("bar" -> 5) ~
        ("bar2" -> 5)) ~
      ("something" -> "else")
    )
    
    val collection: JValue = List(jObject)
    

    JObject 的集合将被转换为 json 数组(因为它可能是 List()List(jObject, jObject))。

    如果你想得到一个值,你必须以某种方式从集合中提取这个值:

    // note type inference here, it will be Seq[JObject] or similar
    def getAll = db withSession { implicit db: Session =>
        // getUsersQuery fetchs all users
        getUsersQuery.list.map { u =>
    
           ("foo" ->
           ("bar" -> 5) ~
           ("bar2" -> 5)) ~
           ("something" -> "else")
    
        }
    }
    
    for {
      j <- getAll.headOption
    } println(pretty(render(j)))
    

    对于单个值(如您最初的问题),它工作得很好:

    import org.json4s.JsonDSL._
    import org.json4s.jackson.JsonMethods._
    // or
    // import org.json4s.native.JsonMethods._
    
    val source = (
      ("foo" ->
        ("bar" -> 5) ~
        ("bar2" -> 5)) ~
      ("something" -> "else")
    )
    
    pretty(render(source))
    // String =
    // {
    //   "foo" : {
    //     "bar" : 5,
    //     "bar2" : 5
    //   },
    //   "something" : "else"
    // }
    

    更新(回复评论):

    def getAll: JValue = (1 to 2).toList map { u =>
      ("bar" -> 5) ~
      ("bar2" -> 5)
    }
    
    val result = (
      ("foos" -> getAll) ~
      ("something" -> "else")
    )
    
    pretty(render(result))
    // String =
    // {
    //   "foos":[{
    //     "bar":5,
    //     "bar2":5
    //   },{
    //     "bar":5,
    //     "bar2":5
    //   }],
    //   "something":"else"
    // }
    

    【讨论】:

    • 我不想要单个值,但仍想保留我的收藏,但没有 []。在集合的最后,我想显示"something" : "else" 部分。这可能吗?
    猜你喜欢
    • 2016-10-18
    • 2018-12-27
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 2019-08-29
    • 2021-06-18
    • 2013-09-28
    相关资源
    最近更新 更多