2014-02-11 43 views
0

這是我有:Json4s產生怪異的Json

(("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") 

    } 
} 

回答

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" 
// } 
+0

請看到我的編輯(詳細信息) – goo

+0

@Jon:查看更新 – senia

+0

我不想要一個值,但仍然想保留我的集合,但沒有'[]'。在收集結束時,我想顯示''something「:」else「'部分。這可能嗎? – goo