2015-01-08 17 views
10

Tôi hiện đang trích xuất một số số liệu từ các nguồn dữ liệu khác nhau và lưu trữ chúng trong bản đồ loại Map[String,Any] trong đó khóa tương ứng với tên chỉ số và giá trị tương ứng với giá trị chỉ số . Tôi cần điều này là ít nhiều chung chung, có nghĩa là các loại giá trị có thể là các kiểu nguyên thủy hoặc danh sách các kiểu nguyên thủy.Bản đồ [String, Any] đến chuỗi json nhỏ gọn sử dụng json4s

Tôi muốn tuần tự hóa bản đồ này thành chuỗi có định dạng JSON và tôi đang sử dụng thư viện json4s. Vấn đề là nó dường như không thể và tôi không thấy một giải pháp có thể cho điều đó. Tôi mong chờ một cái gì đó như sau để làm việc ra khỏi hộp :)

val myMap: Map[String,Any] = ... // extract metrics 
val json = myMap.reduceLeft(_ ~ _) // create JSON of metrics 

Duyệt qua source code Tôi đã nhìn thấy json4s cung cấp chuyển đổi ngầm để chuyển đổi các kiểu dữ liệu để JValue 's và cũng để chuyển đổi Traversable[A]/Map[String,A]/Option[A]-JValue 's (dưới sự hạn chế của việc có sẵn một chuyển đổi tiềm ẩn từ A đến JValue, mà tôi hiểu nó thực sự có nghĩa là A là một kiểu nguyên thủy). Nhà điều hành ~ cung cấp một cách hay để xây dựng JObject 's trong số JField' s, mà chỉ là một bí danh loại cho (String, JValue).

Trong trường hợp này, giá trị bản đồ loại là Any, vì vậy chuyển đổi ngầm không diễn ra và do đó trình biên dịch ném lỗi sau:

    value ~ is not a member of (String, Any) 
[error]    val json = r.reduceLeft(_ ~ _) 

Có một giải pháp cho những gì tôi muốn đạt được?

+0

Nếu tôi hiểu chính xác bạn và bạn chỉ muốn tuần tự hóa 'myMap', tại sao không gọi' Serialization.write (myMap) 'trực tiếp? – edi

+1

@ user3567830 Tôi muốn có một biểu diễn chuỗi JSON của 'myMap', đó là mục đích của việc sử dụng thư viện scala JSON chẳng hạn như' json4s' – jarandaf

+1

Có, 'org.json4s.jackson.Serialization.write (myMap)' thực hiện chính xác điều đó. (Tôi đã sử dụng phiên bản jackson của json4s, nhưng điều này cũng làm việc cho phiên bản gốc). – edi

Trả lời

26

Vì bạn thực sự chỉ tìm kiếm biểu diễn chuỗi JSON là myMap, bạn có thể trực tiếp sử dụng đối tượng Serialization. Dưới đây là một ví dụ nhỏ (nếu sử dụng phiên bản bản địa của json4s thay đổi việc nhập khẩu để org.json4s.native.Serialization):

EDIT: thêm formats ngầm

import org.json4s.jackson.Serialization 

implicit val formats = org.json4s.DefaultFormats 

val m: Map[String, Any] = Map(
    "name "-> "joe", 
    "children" -> List(
    Map("name" -> "Mary", "age" -> 5), 
    Map("name" -> "Mazy", "age" -> 3) 
    ) 
) 
// prints {"name ":"joe","children":[{"name":"Mary","age":5},{"name":"Mazy","age":3}]} 
println(Serialization.write(m)) 
+3

Chỉ để tham khảo thêm, một trường hợp 'Định dạng' tiềm ẩn là bắt buộc, nếu không lỗi sau sẽ hiển thị: 'Không tìm thấy org.json4s.Formats. Hãy thử mang một thể hiện của org.json4s.Formats trong phạm vi hoặc sử dụng org.json4s.DefaultFormats.'. Ví dụ, 'implicit val formats = org.json4s.DefaultFormats' giải quyết vấn đề. – jarandaf

+0

Cảm ơn, tôi đã cập nhật câu trả lời. – edi

0

json4s có phương pháp cho nó.

pretty(render(yourMap)) 
Các vấn đề liên quan