Я думаю, что идиоматический способ состоит в том, чтобы иметь класс case вместо того, чтобы идти против JSON AST вручную.
В вашем случае вы можете иметь поле Option[String]
.
case class MyModel( attributeName: Option[String] )
implicit val rw: ReadWriter[MyModel] = macroRW
read[MyModel](jsonString)
Но, судя по всему, вы могли бы сделать
json.obj.value.get("attributename").map(_.str)
чтобы получить Option[String]
обратно.