我在play scala中有一个等效的以下模型:
case class Foo(id:Int,value:String)
object Foo{
import play.api.libs.json.Json
implicit val fooFormats = Json.format[Foo]
}
Run Code Online (Sandbox Code Playgroud)
对于以下Foo实例
Foo(1, "foo")
Run Code Online (Sandbox Code Playgroud)
我会得到以下JSON文档:
{"id":1, "value": "foo"}
Run Code Online (Sandbox Code Playgroud)
此JSON是持久存储的,并从数据存储区读取.现在我的要求已经改变了,我需要为Foo添加一个属性.该属性具有默认值:
case class Foo(id:String,value:String, status:String="pending")
Run Code Online (Sandbox Code Playgroud)
写入JSON不是问题:
{"id":1, "value": "foo", "status":"pending"}
Run Code Online (Sandbox Code Playgroud)
但是从它读取会产生一个JsError,错过了"/ status"路径.
如何以最小的噪音提供默认值?
(ps:我有一个答案,我将在下面发布,但我对此并不满意,并且会赞成并接受任何更好的选择)
假设有以下json有效负载
val json = """{
"choices" : [
{
"name" : "A"
},
{
"name" : "B"
},
{
"name" : "C"
},
{
"name" : "D"
}
],
"domain" : "Quizz",
"level" : "Test",
"mandatory": true
}"""
Run Code Online (Sandbox Code Playgroud)
我该如何将其转换为
val json = """{
"value":"B",
"domain" : "Quizz",
"level" : "Test",
}"""
Run Code Online (Sandbox Code Playgroud)
从可用选项中随机选择"B"?
这是我到目前为止所得到的:
val cursor = parse(json).getOrElse(Json.Null).cursor
for{
noMandatory<- cursor.downField("mandatory").flatMap(_.delete).map(_.top)
withEmptyValue = noMandatory.deepMerge(Json.obj("value"->Json.Null))
}yield withEmptyValue
Run Code Online (Sandbox Code Playgroud)
这将删除未使用的"必需"字段并插入一个空的"值"字段.从数组中获取一个随机值并将其置于"值"中会让我感到惊讶.
- 编辑
我尝试过使用hcursor,这使得上面更清楚(无论如何)
val cursor = parse(json).getOrElse(Json.Null).hcursor
val noMandatory = cursor.downField("mandatory").delete
val withEmptyValue = …Run Code Online (Sandbox Code Playgroud) 我到处读到业务逻辑属于模型而不是控制器但是限制在哪里?我正在玩个人会计应用程序.
Account
Entry
Operation
Run Code Online (Sandbox Code Playgroud)
创建操作时,只有创建相应的条目并将其链接到帐户才有效,以便操作平衡,例如购买6件装:
o=Operation.new({:description=>"b33r", :user=>current_user, :date=>"2008/09/15"})
o.entries.build({:account_id=>1, :amount=>15})
o.valid? #=>false
o.entries.build({:account_id=>2, :amount=>-15})
o.valid? #=>true
Run Code Online (Sandbox Code Playgroud)
现在,在基本操作的情况下向用户显示的表格被简化以隐藏条目细节,帐户在用户请求的操作类型中选择默认值(初始帐户 - >权益到达,花费资产 - >费用,赚取收入 - >资产,借入负债 - >资产,支付债务资产 - >负债......)我想要从默认值创建的条目.
我还希望能够创建更复杂的操作(超过2个条目).对于第二个用例,我将有一个不同的形式,其中暴露了额外的复杂性.第二个用例使我无法在操作中包含借方和贷方字段并删除Entry链接.
哪种形式最好?像我一样在SimpleOperationController中使用上面的代码,或者在Operation类上定义一个新方法,这样我就可以调用Operation.new_simple_operation(params [:operation])
是不是打破了关注点的分离,实际上是从Operation类创建和操作Entry对象?
我不是在寻找关于我扭曲的会计原则的建议:)
编辑 - 似乎我没有太清楚地表达自己.我不太关心验证.我更关心创建逻辑代码应该去哪里:
假设控制器上的操作被称为花费,当使用花费时,params散列将包含:金额,日期,描述.借方和贷方账户将从被调用的操作中派生出来,但之后我必须创建所有对象.拥有它会更好吗?
#error and transaction handling is left out for the sake of clarity
def spend
amount=params[:operation].delete(:amount)#remove non existent Operation attribute
op=Operation.new(params[:operation])
#select accounts in some way
...
#build entries
op.entries.build(...)
op.entries.build(...)
op.save
end
Run Code Online (Sandbox Code Playgroud)
或者在操作上创建一个方法,使上面看起来像
def spend
op=Operation.new_simple_operation(params)
op.save
end
Run Code Online (Sandbox Code Playgroud)
这肯定会给一个更薄的控制器和一个更胖的模型,但随后该模型将创建和存储其他模型的实例,这是我的问题所在.
我正在寻找一个好的java库来操作框,箭头和标签,以便动态创建和填充如下的图表并将它们渲染为png:
另一个例子

我可以创建一个静态模板,以便稍后填充,但我需要为图中的每个框和边缘动态创建标签.
目前我已尝试使用蜡染来操作svg模板,但为边缘创建多行标签证明非常复杂.使用蜡染的SVG方式似乎迫使我为每个标签行创建1个文本对象,每个标签行都有绝对定位,这是一个真正的痛苦.
我希望能够定义标签,仅指定文本及其相关的链接,最后提示如何放置它并让库放置它们.
有什么建议 ?
我正在尝试转换以下HList
Some(C(15)) :: None :: Some(B(55)) :: None :: Some(A(195)) :: HNil
Run Code Online (Sandbox Code Playgroud)
至
C(15) :: B(55) :: A(195) :: HNil
Run Code Online (Sandbox Code Playgroud)
这就是我现在所拥有的:
import shapeless._
case class A(value: Int)
case class B(value: Int)
case class C(value: Int)
trait folderLP extends Poly2 {
implicit def default[T, L <: HList] = at[T, L]((acc, t) => acc)
}
object folder extends folderLP {
implicit def none[T, L <: HList] = at[None.type, L]((t, acc) => acc)
implicit def someDiameter[T, L <: HList] = at[Some[C], L]((t, acc) …Run Code Online (Sandbox Code Playgroud) 我需要一种从显示文章的任何网页中提取主要文本的方法.类似于Readability可以在任何运行的网站上找到主要文本的方式.
我正在使用Ruby on Rails,所以我认为Hpricot是我最好的选择.我在Hpricot中寻找的是什么?某处有例子吗?谢谢阅读.
在cloudfoundry上部署Play!2应用程序时,我希望能够为启动命令指定至少一个附加参数.
目前看起来cloudfoundry使用Play2创建的启动脚本而没有任何参数,但是要覆盖具有特定生产值的默认应用程序配置,我需要使用-Dconfig.resource = prod.conf来调用它.
我找不到任何办法,可能通过manifest.yml,但我无法找到如何添加此参数的规范.
从这个公寓我成功部署了播放2.0和2.1应用程序到cloudfoundry