2015-10-23 18 views
6

Trước hết, tôi đã tìm kiếm rất nhiều tại Google và StackOverflow cho các câu hỏi như vậy, nhưng tôi không tìm thấy bất kỳ câu trả lời hữu ích nào (ngạc nhiên lớn của tôi).Làm thế nào để tạo một đối tượng JSON trong Scala?

Tôi thấy điều gì đó về Play Framework, how to create JSON array in Javahow to create JSON objects in Java, nhưng tôi không muốn sử dụng Play Framework và tôi không biết liệu việc tạo đối tượng JSON có khác với Scala sang Java hay không.

Sau đây là JSON tôi muốn tạo. Sau đó tôi sẽ chuyển đổi đối tượng thành một chuỗi để gửi nó thông qua một yêu cầu POST (thông qua một cuộc gọi API).

{ 
    "start_relative": { 
     "value": "5", 
     "unit": "years" 
    }, 
    "metrics": [ 
     { 
     "name": "DP_391366" # S-Temperature - Celsius 
     }, 
     { 
      "name": "DP_812682" # Sensor-A4 Luminosity 
     } 
    ] 
} 

Tôi có thể làm điều gì đó như thế trong Scala?

+0

Không rõ bạn đang hỏi gì. Bạn đang cố gắng đi từ một lớp Scala đến một chuỗi JSON? Bạn có thể đăng lớp scala/pobject bạn đang cố gắng chuyển đổi không? – djechlin

+0

Không, tôi không muốn chuyển đổi một lớp Scala thành chuỗi JSON. Tôi muốn tạo một JSON hợp lệ từ Scala. – Paladini

+0

"Scala" nghĩa là gì? – djechlin

Trả lời

6

Bạn nên sử dụng thư viện xử lý tuần tự hóa/deserialization. Tôi sẽ cân nhắc chọn giữa Spray JsonPlay Json.

Tôi sẽ giải thích cho bạn về cách quy trình hoạt động với Phát lần đầu tiên và nó tương tự như trong Phun.

Hãy nói rằng bạn có một lớp học, và một đối tượng với một thể hiện và một json như chuỗi:

case class MyClass(id: Int, 
        name: String, 
        description: String) 

object Data { 
    val obj: MyClass = MyClass(1, "me", "awesome") 
    val str: String = 
     """ 
     |{ 
     | "id": 1, 
     | "name": "me", 
     | "description": "awesome" 
     |} 
     """.stripMargin 
} 

Đối MyClass được serialized/deserialized, bạn sẽ cần một định dạng ngầm, cụ thể cho điều này, vì vậy bạn sẽ tạo một đối tượng chứa trình định dạng này bằng cách sử dụng Phát.

trait MyClassPlayProtocol { 
    implicit val formatAbility = Json.format[Ability] 
} 
object MyClassPlayProtocol extends MyClassPlayProtocol 

Các serialization/deserialization sẽ giống như thế này:

object PlayData { 

    import play.api.libs.json.JsValue 
    import play.api.libs.json.Json 
    import MyClassPlayProtocol._ 
    import General._ 

    val str2Json: JsValue = Json.parse(str) 
    val obj2Json: JsValue = Json.toJson(obj) 

    val json2Str: String = Json.stringify(str2Json) 
    val json2Obj: MyClass = obj2Json.as[MyClass] 
} 

Trong Phun, giao thức sẽ trông như thế này:

trait MyClassSprayProtocol extends DefaultJsonProtocol { 
    implicit val myClassFormat = jsonFormat3(MyClass) 
} 
object MyClassSprayProtocol extends MyClassSprayProtocol 

và serialization/deserialization:

object SprayData { 

    import spray.json._ 
    import MyClassSprayProtocol._ 
    import General._ 

    val str2Json: JsValue = str.parseJson 
    val obj2Json: JsValue = obj.toJson 

    val json2Str: String = str2Json.compactPrint 
    val json2Obj: MyClass = obj2Json.convertTo[MyClass] 
} 

Như bạn có thể thấy, nó chủ yếu là vấn đề được lựa chọn giữa hai điều này. Cả hai vẫn đang được cải thiện và có thể sẽ trong tương lai gần.

Tùy thuộc vào điểm chuẩn, bạn sẽ thấy rằng giá trị này tốt hơn giá trị kia bằng vài miligiây (thường là Phun).

Tôi cho 01:00 sử dụng Phun tại nơi làm việc và Chơi trong một số dự án cá nhân, và tôi không thể nói rằng tôi tìm thấy một cái gì đó hoàn toàn khác nhau từ một đến khác.

EDIT:

Và để cuối cùng trả lời câu hỏi của bạn, để đi MyClass-String (serialization), bạn sẽ làm điều gì đó như thế này:

PLAY: Json.stringify(Json.toJson(myClass)) 
SPRAY: myClass.toJson.compactPrint 

Và deserialization:

PLAY: Json.parse(string).as[MyClass] 
SPRAY: myClass.parseJson.convertTo[MyClass] 
3

Bạn cần phải sử dụng một thư viện nếu bạn không muốn nó làm một mình có serveral:

Lưu ý: Các mát Java Gson thư viện thua rất nhiều kỳ diệu nếu bạn muốn sử dụng nó với Scala, bởi vì họ không biết Bộ sưu tập. Vì vậy, nếu bạn muốn sử dụng thư viện này, bạn phải chuyển đổi "Danh sách Scala" thành java.util.List và sau đó sử dụng Gson.

+1

Bạn cũng có thể sử dụng Jackson với [Scala module] (https://github.com/FasterXML/jackson-module-scala). – 2rs2ts

Các vấn đề liên quan