2016-11-02 6 views
1

Я устал писать blah: "${JSON.stringify(target)}", когда я занимаюсь своими объектами DTO, я просто хочу написать blah: "$target".Как переопределить метод toString() на объектах JS для использования JSON.stringify()?

Моего DTOS выглядеть следующим образом:

@js.native 
trait AuthConnectionDetails extends js.Object { 
    def clientId: String = js.native 
    def accountHostname: String = js.native 
} 

Этих DTOS используются для анализа содержания некоторых REST API вызовов, например:

val response = js.JSON.parse(xmlHttpRequest.responseText). 
    asInstanceOf[AuthConnectionDetails] 

Я не против изменения, как я определяю мой DTO объекты для этого (возможно, я должен использовать классы case для своих DTO или что-то, вместо собственных js-признаков?), но я не могу понять, как это сделать.

Я попытался написать черту, которую я мог бы смешивать, но это не сработало, и я попытался написать неявный метод расширения, но это тоже не сработало.

Мой неявный код, который не похоже на работу для ToString:

object JsonToString { 
    implicit class JsObjectExtensions(val target: js.Object) extends AnyVal { 
    override def toString:String = JSON.stringify(target) 
    def json:String = JSON.stringify(target) 
    } 
} 

Так что я могу сделать blah: "${target.json}", что лучше - но я бы особенно хотел, чтобы избавиться от этих скобок.

Есть ли способ сделать это с помощью scala.js?

ответ

2

Нет, нет способа сделать это. Это потому, что интерполяция строк всегда будет использовать метод toString()самого объекта, независимо от того, что есть , объявленный в его типах или в неявных классах (это вообще вещь Scala).

Единственный способ, которым вы могли бы достичь этого, - это фактически изменить объекты, исправляя их с помощью настраиваемого метода toString() каждый раз, когда вы его создаете. Это будет включать, когда вы анализируете их из строки JSON. Я уверен, что было бы хуже, чем позвонить .json, когда вы их укорачиваете.

2

Если вы действительно хотите, вы можете написать свой собственный струнный интерпол:

implicit class JsonHelper(private val sc: StringContext) extends AnyVal { 
    def dejson(args: Any*): JSONObject = { 
    sc.checkLengths(args) 
    s(args.map(jsonify)) 
    } 

    private def jsonify(arg: Any) = arg match { 
    case obj: js.Object => JSON.stringify(obj) 
    case _ => arg.toString 
    } 
} 

Теперь вы можете использовать это так:

dejson"hello: $target, world: $target2" 
Смежные вопросы