【问题标题】:JSON Stringify Erasing Certain Attributes in Google Place ObjectJSON Stringify 删除 Google Place 对象中的某些属性
【发布时间】:2016-02-19 16:17:09
【问题描述】:

在这里遇到了一个相当神秘的问题。使用 Rails 4 应用和 Google Maps Javascript API v3。

我们使用 Google 搜索自动完成功能来获取 Google 的“地点”对象,然后将该地点对象传递给 Rails,以便存储某些属性(例如 google_place_id、lat、long)。

直到昨天,我们的代码都运行良好。奇怪的是我们没有触及那段代码,然后这部分突然中断了。

CoffeeScript 代码:

saveDestinationToDatabase = (place) ->
  console.log 'Place.geo.loc: ' + place.geometry.location
  console.log 'Place.stringify: ' + JSON.stringify(place)
  $.ajax '/destinations',
    dataType: 'json'
    type: 'POST'
    async: false
    data:
      place: JSON.stringify(place)
      trip_id: tripID
    success: (data) ->
      return data
    failure: ->
      alert 'saveDestiantionToDatabase() Unsuccessful'
      return

第一个 console.log 返回: Place.geo.loc: (41.87194, 12.567379999999957),表示Geometry对象的值正确。

第二个 console.log 返回: Place.stringify: {"address_components":[{"long_name":"Italy","short_name":"IT","types":["country","political"]}],"adr_address":"<span class=\"country-name\">Italy</span>","formatted_address":"Italy","geometry":{"location":{}, ...}

请注意,geometry.location 现在是空白的。

  1. 为什么 JSON.stringify 会导致该值被删除?
  2. 为什么在不更改代码的情况下会开始出现此错误?

更新:解决方案 背负 Dr.Molle 在下面的回答,我刚刚从我需要的 PlaceResult 详细信息中创建了一个 JSON 对象。这让我可以事先调用 Google 的 lat() 和 lng() 方法。

工作咖啡脚本:

saveDestinationToDatabase = (place) ->
  place_lat = place.geometry.location.lat()
  place_lng = place.geometry.location.lng()
  $.ajax '/destinations',
    dataType: 'json'
    type: 'POST'
    async: false
    data:
      place:
        name: place.name
        place_id: place.place_id
        formatted_address: place.formatted_address
        address_components: place.address_components
        lat: place_lat
        lng: place_lng
      trip_id: tripID
    success: (data) ->
      return data
    failure: ->
      alert 'saveDestiantionToDatabase() Unsuccessful, please alert site admins'
      return

【问题讨论】:

  • Google 是不是在你背后偷偷溜进了toJSON 方法?
  • 如果我将JSON.stringify(place) 替换为place,控制台中的结果为Place.stringify: [object Object]。看起来 Google 并未对对象进行 JSON 化处理。
  • 你误会了。当你调用JSON.stringify(o) 时,它会在o 内部任何有这样一个方法的东西上调用toJSONdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

标签: javascript json google-maps coffeescript


【解决方案1】:

place.geometry.location 的构造函数是一个函数(google.maps.LatLng),函数不能通过 JSON 传输

当您登录place.geometry.location 时看到的是google.maps.LatLngtoString 方法的returnValue

【讨论】:

  • 谢谢!那么解决方案是使用我需要的位置属性创建我自己的 JSON 对象,然后通过 AJAX 发送该对象吗?知道为什么它以前可以工作吗?
  • 是的,这将是一个解决方案(您可以使用现有对象并用所需的值覆盖geometry.location)。我不知道为什么它之前一直在工作,也许 JSON-parser 已经改变了
猜你喜欢
  • 2018-05-27
  • 2015-03-13
  • 2016-07-01
  • 2018-09-10
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多