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. 确认确实entrySet()是以单位出现的 Gson 方法?
  2. 如果不是,代码的哪一部分造成了问题?我已经为eventData类方法设置了返回类型/值
  3. Gson Unit 问题是否有解决方法?

谢谢!

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 回答