2012-04-19 58 views
0

我知道JSON输出格式为given by GoogleGoogle Maps Javascript API v3返回不同的JSON?

但是,我有时会得到一个slightly different format。这是从results变量的gecoder.geocode({'address': address}, callback)

"location": { 
      "Za": 37.3492097, 
      "$a": -122.03260190000003 
     }, 

回调函数...

"viewport": { 
      "aa": { 
      "b": 37.329901, 
      "f": 37.37543489999999 
      }, 
      "ba": { 
      "b": -122.06526500000001, 
      "f": -121.99577999999997 
      } 
     } 

通知下位置,范围和视口的钥匙 - 他们是从什么标准不同。这对我来说是个问题,因为我需要通过 AJAX调用和 将此JSON发送到我的服务器并解析它,并且我的解析器不能将“$ a”作为有效的密钥名称。

这是正常的还是我错过了什么?编辑: 我正在一个云托管平台(salesforce.com)上。我们正在使用JavaScript API v3。我能够从本地HTML文件复制此问题。 我现在认为这可能是因为我支持公司代理。任何人都面对过这个?

+0

为什么你的解析器不能使用它?这是一个有效的json密钥名称。也许修复你的解析器? – tkone 2012-04-19 11:06:14

+0

正确制定的​​查询的结果是“略有不同的格式”数据吗?那个查询是什么?如果您遵循了文档,结果应该一致。 – 2012-04-19 11:17:25

+0

我正在使用的解析器内置于我所使用的平台中,期望键值是类中的变量名称,“$”不是接受的字符 – 2012-04-19 13:28:26

回答

0

正如在对错误报告和API文档的评论中指出的,回调中的response对象不是纯JSON。为了得到一个JSON对象,我需要像下面这样创建一个:

//assume status is ok 

var bestResult = getBestResultFromJSON(results); 

var bounds = {'northeast' : {'lat' : 0, 'lng' : 0}, 'southwest' : {'lat' : 0, 'lng' : 0}}; 
var location = {'lat' : 0, 'lng' : 0}; 
var viewport = {'northeast' : {'lat' : 0, 'lng' : 0}, 'southwest' : {'lat' : 0, 'lng' : 0}}; 
// bounds not always available (https://developers.google.com/maps/documentation/javascript/reference#GeocoderGeometry) 
if(bestResult.geometry.hasOwnProperty(bounds)) { 
    bounds.southwest.lat = bestResult.geometry.bounds.getSouthWest().lat(); 
    bounds.southwest.lng = bestResult.geometry.bounds.getSouthWest().lng(); 
    bounds.northeast.lat = bestResult.geometry.bounds.getNorthEast().lat(); 
    bounds.northeast.lng = bestResult.geometry.bounds.getNorthEast().lng(); 
} 
else { 
    bounds = null; 
}      

viewport.southwest.lat = bestResult.geometry.viewport.getSouthWest().lat(); 
viewport.southwest.lng = bestResult.geometry.viewport.getSouthWest().lng(); 
viewport.northeast.lat = bestResult.geometry.viewport.getNorthEast().lat(); 
viewport.northeast.lng = bestResult.geometry.viewport.getNorthEast().lng(); 

location.lat = bestResult.geometry.location.lng(); 
location.lng = bestResult.geometry.location.lng(); 

var jsonResults = {'results' : [{'address_components' : bestResult.address_components, 
       'formatted_address': bestResult.formatted_address, 
       'geometry' : {'bounds' : bounds, 'location' : location, 'location_type' : bestResult.location_type, 'viewport' : viewport}, 
       'types' : bestResult.types}], 'status' : status}; 
0

如果您仅使用记录的方法并获得未记录的响应,则表示存在错误。在Issues List中提出问题 - 如果存在一个能够持续产生错误响应的地址,则需要包含演示地址。如果没有一致错误的地址,请尽可能详细地提供。例如,是否在请求重复过于靠近的情况下发生?

确保您还使用不同的浏览器客户端以及甚至不同的机器进行测试。您当前的浏览器或计算机中可能存在一个奇怪的情况,导致该API错误操作。

我建议用问题编号评论这个答案以备将来参考。

+0

我已经提交[bug 4089](http://code.google.com/p/gmaps-api-issues/issues/detail?id=4089) 看起来,即使从谷歌的地理编码示例页面,答案是不正确的。请参阅:https://google-developers.appspot.com/maps/documentation/javascript/examples/geocoding-simple – 2012-04-20 07:09:34

+0

该报告中的*数量多于此问题。使用salesforce.com,https和身份验证可能都是相关的(这也意味着您应该拥有Google直接支持的Maps for Business许可证)。试着依次排除这三个组合中的每一个,并看看它是否有所作为。例如,我不使用https或salesforce.com,也从来没有像这样的问题。 – 2012-04-20 07:25:31

+0

我们没有使用Maps for Business _yet_。 我甚至创建了一个简单的HTML文件,并得到相同的。我现在在想,也许是因为我在代理的背后?一旦我尝试从不同的网络尝试它,就会回圈 – 2012-04-20 07:41:42