0

今日の悩みのテーマはユニットのようです。私は Gson を使用する JSON デシリアライザーを移植していますが、これに関しては for ループ:

  def deserialize(json:JsonElement, 
                  typeOfT:Type, 
                  context:JsonDeserializationContext) = {
    var eventData = new EventData(null, null)
    var jsonObject = json.getAsJsonObject
    for(entry <- jsonObject.entrySet()) {
      var key = entry.getKey()
      var element = entry.getValue()
      element
      if("previous_attributes".equals(key)) {
        var previousAttributes = new scala.collection.mutable.HashMap[String, Object]()
        populateMapFromJSONObject(previousAttributes, element.getAsJsonObject())
        eventData.setPreviousAttributes(previousAttributes)
        eventData
      } else if ("object".equals(key)) {
        val `type` = element.getAsJsonObject().get("object").getAsString()
        var cl = objectMap.get(`type`).asInstanceOf[StripeObject]
        var `object` = abstractObject.retrieve(cl, key)
        eventData.setObject(`object`)
        eventData
      }
    }
  }

コンパイラはエラーを吐き出し、次のtype mismatch; found : Unit required: com.stripe.EventData行を指します:for(entry <- jsonObject.entrySet())

質問

  1. ユニットとして登場するGsonメソッドであることを確認entrySet()
  2. そうでない場合、コードのどの部分が問題を引き起こしていますか? eventDataクラスメソッドの戻り値の型/値を設定しました
  3. Gson ユニットの問題の回避策はありますか?

ありがとう!

4

1 に答える 1

2

コンパイラ エラーはやや不可解であり、実際には固有の問題があります。同僚のおかげで最初の基礎:

  1. Scala の for ループは戻りません。代わりに、後でそれを返すためにリストを構築する必要があります。
  2. マップは、反復ごとにオンザフライで自然に返されます。

第二に、私が抱えていた問題は、私自身のバグが原因でした。メソッドの最後に戻るのを忘れていたeventDataので、最終的にはこのきれいな関数を取得しました。

@SuppressWarnings(Array("unchecked"))
  def deserialize(json:JsonElement, typeOfT:Type, context:JsonDeserializationContext) = {
    var eventData = new EventData(null, null)
    var jsonObject = json.getAsJsonObject
    for(entry <- jsonObject.entrySet()) {

      var key = entry.getKey()
            var element = entry.getValue()
            if("previous_attributes".equals(key)) {
                var previousAttributes = new scala.collection.mutable.HashMap[String, Object]()
                populateMapFromJSONObject(previousAttributes, element.getAsJsonObject())
                eventData.setPreviousAttributes(previousAttributes)
            } else if ("object".equals(key)) {
                val `type` = element.getAsJsonObject().get("object").getAsString()
                var cl = objectMap.get(`type`).asInstanceOf[StripeObject]
                var `object` = abstractObject.retrieve(cl, key)
                eventData.setObject(`object`)
            }
    }
    eventData
  }

コンパイラが for ループの途中を指していることに混乱しましたが、実際には Gson オブジェクトではなく、メソッドによって返されたものを参照していました。

于 2012-06-07T23:39:13.903 に答える