小编Jea*_*ean的帖子

播放2 JSON格式中缺少属性的默认值

我在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 scala playframework-2.2

34
推荐指数
4
解决办法
1万
查看次数

转换Json与circe

假设有以下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)

json scala circe

8
推荐指数
1
解决办法
3958
查看次数

为了瘦小的控制器,轨道型号是否应该关注其他型号?

我到处读到业务逻辑属于模型而不是控制器但是限制在哪里?我正在玩个人会计应用程序.

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)

这肯定会给一个更薄的控制器和一个更胖的模型,但随后该模型将创建和存储其他模型的实例,这是我的问题所在.

ruby ruby-on-rails

5
推荐指数
1
解决办法
809
查看次数

Java库创建和动态修改业务图

我正在寻找一个好的java库来操作框,箭头和标签,以便动态创建和填充如下的图表并将它们渲染为png: 在此输入图像描述 另一个例子 在此输入图像描述

我可以创建一个静态模板,以便稍后填充,但我需要为图中的每个框和边缘动态创建标签.

目前我已尝试使用蜡染来操作svg模板,但为边缘创建多行标签证明非常复杂.使用蜡染的SVG方式似乎迫使我为每个标签行创建1个文本对象,每个标签行都有绝对定位,这是一个真正的痛苦.

我希望能够定义标签,仅指定文本及其相关的链接,最后提示如何放置它并让库放置它们.

有什么建议 ?

java diagram drawing

5
推荐指数
1
解决办法
1214
查看次数

用于无形Hlist的通用Poly2文件夹案例

我正在尝试转换以下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)

generics scala fold hlist shapeless

5
推荐指数
1
解决办法
1009
查看次数

我可以使用Hpricot查找任何/大多数网站的主要文章文本吗?

我需要一种从显示文章的任何网页中提取主要文本的方法.类似于Readability可以在任何运行的网站上找到主要文本的方式.

我正在使用Ruby on Rails,所以我认为Hpricot是我最好的选择.我在Hpricot中寻找的是什么?某处有例子吗?谢谢阅读.


ruby screen-scraping hpricot

2
推荐指数
1
解决办法
524
查看次数

如何在cloudfoundry中为播放应用程序传递其他启动参数

在cloudfoundry上部署Play!2应用程序时,我希望能够为启动命令指定至少一个附加参数.

目前看起来cloudfoundry使用Play2创建的启动脚本而没有任何参数,但是要覆盖具有特定生产值的默认应用程序配置,我需要使用-Dconfig.resource = prod.conf来调用它.

我找不到任何办法,可能通过manifest.yml,但我无法找到如何添加此参数的规范.

从这个公寓我成功部署了播放2.0和2.1应用程序到cloudfoundry

cloud-foundry playframework-2.0 playframework-2.1

1
推荐指数
1
解决办法
775
查看次数