gpt4 book ai didi

json - 如何在 Json 中序列化 val 元素

转载 作者:行者123 更新时间:2023-12-04 22:49:44 26 4
gpt4 key购买 nike

序列化以下案例类时,不包括 val 元素。为什么会这样,我可以包含它吗?

case class Asset(id: Option[Int], description: Option[String]= None) {
val url = "images/" + id.toString+".png"
}

更新:添加了 Json 库,以及 url“属性”的规范/预期用途。

我正在使用 Play 2.1/Scala 2.10 附带的 Json 库。

实际上 url 属性是一个函数,它将根据配置查找转换算法,例如图像可以在本地可用,也可以从外部主机获取。

最佳答案

虽然您确实需要指定您使用的是哪个 json 序列化库,但几乎可以保证只需执行以下操作即可:

case class Asset(id: Option[Int], description: Option[String]= None, url = "images/" + id.toString+".png")

鉴于url无论如何都有一个默认值,将它变成一个参数不会对您的代码产生负面影响(您仍然可以像以前一样通过示例执行 Asset(None))。唯一的缺点是现在客户端代码可能会创建一个 Asset url 具有不同值的实例,这可能不是您想要的。

如果是这种情况,您可能需要为您的 Asset 创建自定义 json 格式类,但不知道您使用的是哪个序列化库,在这方面我帮不上什么忙。


更新:

糟糕,我完全错过了 url 的默认值这一事实取决于另一个参数( id )(感谢@Kristian Domagala 的注意)。因此我上面的代码片段没有编译。一种简单的解决方案是将 url在@Kristian Domagala 建议的第二个参数列表中:

case class Asset(id:Option[Int],description:Option[String]=None)(val url:String = "images/" + id.toString+".png")

但这可能并不理想,因为这改变了 Asset 的等式语义。 (比较实例时不再考虑 url),并且还更改了构造语法:当显式指定 url 时值(value),你需要做类似Asset(Some(123))("gfx/myImage.png")的事情而不是通过示例 Asset(Some(123), url="gfx/myImage.png") .如果您可以忍受这些缺点,这无疑是最简单的解决方案。

否则,还有另一种解决方法:我们可以重新定义 Asset.apply我们自己(手工):

case class AssetImpl( val id: Option[Int], val description: Option[String], val url: Option[String]) {
override def productPrefix = "Asset"
}
type Asset = AssetImpl
object Asset {
def apply( id: Option[Int], description: Option[String] = None, url: Option[String] = None ) = {
new Asset( id, description, url.orElse( id.map( "images/" + _ + ".png") ) )
}
}

如你所见,我已转 url进入 Option默认值为 None (避免之前的编译错误,因为它不再依赖于 id)由于 ,并且在 def apply... 中我实例化 Asset默认值为 url (这是我实际获得 id 的值的地方) id.map( "images/" + _ + ".png") .

剩下的基本上只是能够重新定义 Asset.apply 的噪音:事实证明,事实上你不能重新定义一个案例类的工厂(你只能添加单独的重载)。所以我将类(class)重命名为 AssetImpl , 添加了一个类型别名以便没人注意到 ( ;-) ), 并创建了我自己的对象 Asset我在哪里定义 apply方法(不再与自动生成的 apply 方法冲突,因为这个方法位于不同的 AssetImpl 对象中。我也可以简单地转 Asset进入标准类(非案例类),但我将不得不重新定义 equalshashCode考虑到在向类中添加/删除字段时必须维护它,我觉得这更烦人。

关于json - 如何在 Json 中序列化 val 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14857009/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com