2012-03-01 24 views
7

Đối với một đoạn XML như thế này:XML để JSON với Scala

val fruits = 
<fruits> 
    <fruit> 
    <name>apple</name> 
    <taste>ok</taste> 
    </fruit> 
    <fruit> 
    <name>banana</name> 
    <taste>better</taste> 
    </fruit> 
</fruits> 

làm một cái gì đó như:

fruits \\ "fruit" 

sẽ trả về một chuỗi các loại scala.xml.NodeSeq với tất cả các loại trái cây và các nút phụ bên trong.

Cách tốt nhất để chuyển đổi điều này thành danh sách đối tượng JSON là gì? Tôi đang cố gắng gửi danh sách các loại trái cây của mình trở lại trình duyệt. Tôi đã có một cái nhìn tại scala.util.parsing.json.JSONObjectscala.util.parsing.json.JSONArray, nhưng tôi không biết làm thế nào để có được từ NodeSeq cho bất cứ ai sau này.

Nếu có thể, tôi rất thích xem nó được thực hiện bằng mã Scala trơn tru như thế nào.

Trả lời

14

This có thể có liên quan. Đây là giải pháp của tôi sử dụng spray-json:

import scala.xml._ 
import cc.spray.json._ 
import cc.spray.json.DefaultJsonProtocol._ 

implicit object NodeFormat extends JsonFormat[Node] { 
    def write(node: Node) = 
    if (node.child.count(_.isInstanceOf[Text]) == 1) 
     JsString(node.text) 
    else 
     JsObject(node.child.collect { 
     case e: Elem => e.label -> write(e) 
     }: _*) 

    def read(jsValue: JsValue) = null // not implemented 
} 

val fruits = 
    <fruits> 
    <fruit> 
     <name>apple</name> 
     <taste> 
     <sweet>true</sweet> 
     <juicy>true</juicy> 
     </taste> 
    </fruit> 
    <fruit> 
     <name>banana</name> 
     <taste>better</taste> 
    </fruit> 
    </fruits> 

val json = """[{"name":"apple","taste":{"sweet":"true","juicy":"true"}},{"name":"banana","taste":"better"}]""" 

assert((fruits \\ "fruit").toSeq.toJson.toString == json) 
+1

này sẽ rất tốt, nhưng mẫu của bạn không chạy. Tôi nhận được sau đây: lỗi: không tìm thấy: giá trị JsField. – Jack

+0

@JacobusR Rất tiếc, vẫn đang sử dụng phiên bản 1.0.1 của phun-json. Thực sự không có lớp 'JsField' trong 1.1.0. Thay thế nó bằng một tuple. – elbowich

+0

Hoạt động như một sự quyến rũ, cảm ơn. Luôn luôn đáng yêu để có được một bit runnable mã, chứ không phải chỉ là một đoạn (+1 cho rằng :-). – Jack

2

Tôi nghĩ bạn nên sử dụng ScalaXB để biến XML thành các lớp scala và sau đó viết các bit toJson thích hợp vào đầu ra Json.

Nên làm việc điều trị.

+5

Vấn đề với ScalaXB là nó đòi hỏi lược đồ XML –