Дерево Scalaz в JSON

В настоящее время я пытаюсь использовать класс Tree для построения древовидной структуры из запроса к базе данных. После этого я хочу преобразовать его в объект json (с API playframework).

Некоторые примеры или еще немного документации для класса Tree были бы потрясающими. Я не могу понять метод draw и drawTree, которые могут делать то же самое.

Пример

val tree = ("Root", 100).node(
        ("Category1", 30).leaf,
        ("Category2", 20).node(
          ("Sub1", 15).leaf,
          ("Sub2", 3).leaf,
          ("Sub3", 2).leaf),
        ("Category3", 10).leaf,
        ("Category4", 30).node(
          ("Sub1", 20).leaf,
          ("Sub2", 5).leaf))

Это должно привести к такому дереву json

{
  "name" : "Root",
  "value" : 100,
  "children" : [
     { 
        "name" : "Category1",
        "value": 30
     },
     {
        "name": "Category2",
        "value": 20,
        "children" : [
             {
                "name" : "Sub1",
               "value" : 15"
             } ....
        ]

  ]

person Muki    schedule 23.11.2013    source источник


Ответы (2)


Написать экземпляр Writes для этого дерева вполне возможно:

import scalaz.Tree, Tree.Node

implicit def treeWrites: Writes[Tree[(String, Int)]] =
  new Writes[Tree[(String, Int)]] {
    def writes(o: Tree[(String, Int)]) = o match {
      case Node((name, value), children) => Json.obj(
        "name" -> name,
        "value" -> value,
        "children" -> JsArray(children.map(Json.toJson(_)))
      )
    }
  }

Это довольно простая реализация, и она покажет пустой массив children для листьев, но его, несомненно, можно улучшить, немного поработав.

person Ben James    schedule 23.11.2013

Метод drawTree предназначен только для визуализации дерева, а это совсем другое:

scala> tree.drawTree
res2: String = 
"("Root",100)
|
+- ("Category1",30)
|
+- ("Category2",20)
|  |
|  +- ("Sub1",15)
|  |
|  +- ("Sub2",3)
|  |
|  `- ("Sub3",2)
|
+- ("Category3",10)
|
`- ("Category4",30)
   |
   +- ("Sub1",20)
   |
   `- ("Sub2",5)
"
person Apocalisp    schedule 23.11.2013