【问题标题】:Scalaz Tree to JSONScalaz 树到 JSON
【发布时间】:2013-11-23 18:06:52
【问题描述】:

我目前正在尝试使用Tree 类从数据库查询构建树结构。之后我想将其转换为 json 对象(使用 playframework api)。

Tree 类的一些示例或更多文档会很棒。我无法理解 drawdrawTree 方法,这可能会做类似的事情。

示例

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"
             } ....
        ]

  ]

【问题讨论】:

    标签: json scala tree scalaz scalaz7


    【解决方案1】:

    为这棵树写一个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 数组,但无疑可以通过一些额外的工作来改进。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-30
        • 1970-01-01
        相关资源
        最近更新 更多