0

Scala を使用して以下の Json オブジェクト構造を生成するにはどうすればよいですか :

{
    "name": "flare",
        "children": [{
        "name": "analytics",
            "children": [{
            "name": "cluster",
                "children": [{
                "name": "AgglomerativeCluster",
                "size": 3938
            }, {
                "name": "CommunityStructure",
                "size": 3812
            }, {
                "name": "HierarchicalCluster",
                "size": 6714
            }, {
                "name": "MergeEdge",
                "size": 743
            }]
        }, {
            "name": "graph",
                "children": [{
                "name": "BetweennessCentrality",
                "size": 3534
            }, {
                "name": "LinkDistance",
                "size": 5731
            }, {
                "name": "MaxFlowMinCut",
                "size": 7840
            }, {
                "name": "ShortestPaths",
                "size": 5914
            }, {
                "name": "SpanningTree",
                "size": 3416
            }]
        }, {
            "name": "optimization",
                "children": [{
                "name": "AspectRatioBanker",
                "size": 7074
            }]
        }]
    }, {
        "name": "animate",
            "children": [{
            "name": "Easing",
            "size": 17010
        }, {
            "name": "FunctionSequence",
            "size": 5842
        }, {
            "name": "interpolate",
                "children": [{
                "name": "ArrayInterpolator",
                "size": 1983
            }, {
                "name": "ColorInterpolator",
                "size": 2047
            }, {
                "name": "DateInterpolator",
                "size": 1375
            }, {
                "name": "Interpolator",
                "size": 8746
            }, {
                "name": "MatrixInterpolator",
                "size": 2202
            }, {
                "name": "NumberInterpolator",
                "size": 1382
            }, {
                "name": "ObjectInterpolator",
                "size": 1629
            }, {
                "name": "PointInterpolator",
                "size": 1675
            }, {
                "name": "RectangleInterpolator",
                "size": 2042
            }]
        }, {
            "name": "ISchedulable",
            "size": 1041
        }, {
            "name": "Parallel",
            "size": 5176
        }, {
            "name": "Pause",
            "size": 449
        }, {
            "name": "Scheduler",
            "size": 5593
        }, {
            "name": "Sequence",
            "size": 5534
        }, {
            "name": "Transition",
            "size": 9201
        }, {
            "name": "Transitioner",
            "size": 19975
        }, {
            "name": "TransitionEvent",
            "size": 1116
        }, {
            "name": "Tween",
            "size": 6006
        }]
    }, {
        "name": "data",
            "children": [{
            "name": "converters",
                "children": [{
                "name": "Converters",
                "size": 721
            }, {
                "name": "DelimitedTextConverter",
                "size": 4294
            }, {
                "name": "GraphMLConverter",
                "size": 9800
            }, {
                "name": "IDataConverter",
                "size": 1314
            }, {
                "name": "JSONConverter",
                "size": 2220
            }]
        }, {
            "name": "DataField",
            "size": 1759
        }, {
            "name": "DataSchema",
            "size": 2165
        }, {
            "name": "DataSet",
            "size": 586
        }, {
            "name": "DataSource",
            "size": 3331
        }, {
            "name": "DataTable",
            "size": 772
        }, {
            "name": "DataUtil",
            "size": 3322
        }]
    }, {
        "name": "display",
            "children": [{
            "name": "DirtySprite",
            "size": 8833
        }, {
            "name": "LineSprite",
            "size": 1732
        }, {
            "name": "RectSprite",
            "size": 3623
        }, {
            "name": "TextSprite",
            "size": 10066
        }]
    }, {
        "name": "flex",
            "children": [{
            "name": "FlareVis",
            "size": 4116
        }]
    }, {
        "name": "physics",
            "children": [{
            "name": "DragForce",
            "size": 1082
        }, {
            "name": "GravityForce",
            "size": 1336
        }, {
            "name": "IForce",
            "size": 319
        }, {
            "name": "NBodyForce",
            "size": 10498
        }, {
            "name": "Particle",
            "size": 2822
        }, {
            "name": "Simulation",
            "size": 9983
        }, {
            "name": "Spring",
            "size": 2213
        }, {
            "name": "SpringForce",
            "size": 1681
        }]
    }]
};
}

これは私がこれまでに持っているものです:

object DendorgramTORecursive {

  def getObject = {

    val topLevelNode = new com.data.recursive.DendogramVO
    topLevelNode.setName("flare")

    val level1Node = new com.data.recursive.Children
    level1Node.setName("analytics")

    val level1NodeData = new java.util.ArrayList[com.data.recursive.Children]()
    level1NodeData.add(level1Node);

    level1Node.setChildren(level1NodeData)

    //topLevelNode.setChildren(level1Node)

    topLevelNode
  }

}

package com.data.recursive;

import java.util.List;

public class DendogramVO {
    private List<Children> children;
    private String name;

    public List<Children> getChildren() {
        return this.children;
    }

    public void setChildren(List<Children> children) {
        this.children = children;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

package com.data.recursive;

import java.util.List;

public class Children {

    private List<Children> children;
    private String name;

    public List<Children> getChildren() {
        return children;
    }

    public void setChildren(List<Children> children) {
        this.children = children;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

これは以下の json を返します:

"{"children":[{"children":[{"name":"cluster","children":[{"name":"AgglomerativeCluster","size":3938},{"name":"TestCLuster","size":3938}]}],"name":"analytics"}],"name":"flare"}"

これは面倒なようで、これを行うためのよりクリーンな方法が必要だと思いますか?

4

5 に答える 5

2

新しいコースを受講することをお勧めします: coursera.org のリアクティブ プログラミングの原則。

最初の講義では、素敵な Json のプレゼンテーションがあります。

abstract class JSON
case class JSeq (elems: List[JSON]) extends JSON
case class JObj (bindings: Map[String, JSON]) extends JSON
case class JNum (num: Double) extends JSON
case class JStr (str: String) extends JSON
case class JBool(b: Boolean) extends JSON
case object JNull extends JSON


val data = JObj(Map(
  ”firstName” -> JStr(”John”),
  ”lastName” -> JStr(”Smith”),
  ”address” -> JObj(Map(
  ”streetAddress” -> JStr(”21 2nd Street”),
  ”state” -> JStr(”NY”),
  ”postalCode” -> JNum(10021)
)),
  ”phoneNumbers” -> JSeq(List(
  JObj(Map(
    ”type” -> JStr(”home”), ”number” -> JStr(”212 555-1234”)
  )),
  JObj(Map(
    ”type” -> JStr(”fax”), ”number” -> JStr(”646 555-4567”)
  )) )) ))

def show(json: JSON): String = json match {
  case JSeq(elems) =>
    ”[” + (elems map show mkString ”, ”) + ”]”
  case JObj(bindings) =>
    val assocs = bindings map {
      case (key, value) => ”\”” + key + ”\”: ” + show(value)
    }
    ”{” + (assocs mkString ”, ”) + ”}”
  case JNum(num) => num.toString
  case JStr(str) => ’\”’ + str + ’\”’
  case JBool(b) => b.toString
  case JNull => ”null”
}
于 2013-11-05T01:37:54.517 に答える
0

Gensonを使用すると、scala Map/Seq またはケース クラスを Json に簡単にマッピングして戻すことができます

import com.owlike.genson.defaultGenson_

val json = toJson(Map("name" -> "foo"))
val value = fromJson[Map[String, String](json)

また、それは好みの問題かもしれませんが、Genson は他のライブラリのように暗黙を多用しません。たとえば、暗黙的に構成するのではなく、より古典的なビルダーを使用して構成し、コードをより読みやすくします。

import com.owlike.genson._

object CustomGenson {
  lazy val customGenson = new ScalaGenson(
    new GensonBuilder()
      .useIndentation(true)
      .useDateAsTimestamp(true)
      .withBundle(new JodaTimeBundle())
      .create()
  )
}

// then just import it in the places you want to use this instance instead of the default one
import CustomGenson.customGenson._
于 2014-06-27T13:03:45.457 に答える
0

また、scala picklingは JSON との間で変換します。それはタイプセーフなプロジェクトだと思います。

于 2013-11-05T17:02:55.580 に答える