栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

播放2.6

按照@CanardMoussant的回答,从Play 2.6开始,对play-
json宏进行了改进,并提出了多个新功能,包括在反序列化时使用默认值作为占位符:

implicit def jsonFormat = Json.using[Json.WithDefaultValues].format[Foo]

对于低于2.6的比赛,最好的选择仍然是使用以下选项之一:

播放json-extra

我发现了一个更好的解决方案,可以解决我在play-json中遇到的大多数缺点,包括问题中的一个:

play-json-extra内部使用[play-json-extensions]解决此问题中的特定问题。

它包含一个宏,该宏将自动在序列化器/反序列化器中包含缺少的默认值,从而使重构的错误率大大降低!

import play.json.extra.Jsonximplicit def jsonFormat = Jsonx.formatCaseClass[Foo]

库中还有更多您可能要检查的内容:play-json-extra

杰森变压器

我当前的解决方案是创建一个JSON Transformer,并将其与宏生成的Reads结合起来。变压器通过以下方法生成:

object JsonExtensions{  def withDefault[A](key:String, default:A)(implicit writes:Writes[A]) = __.json.update((__  key).json.copyFrom((__  key).json.pick orElse Reads.pure(Json.toJson(default))))}

格式定义将变为:

implicit val fooformats: Format[Foo] = new Format[Foo]{  import JsonExtensions._  val base = Json.format[Foo]  def reads(json: JsValue): JsResult[Foo] = base.compose(withDefault("status","bidon")).reads(json)  def writes(o: Foo): JsValue = base.writes(o)}

Json.parse("""{"id":"1", "value":"foo"}""").validate[Foo]

确实会生成一个Foo实例,并应用默认值。

我认为这有2个主要缺陷:

  • 默认密钥名称在字符串中,不会被重构获取
  • 默认值是重复的,如果在一个位置更改,则需要在另一位置手动更改


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/425795.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号