为什么我们要在解析JSON或webservice响应的情况下用Java显式地转换?

时间:2015-04-04 05:12:08

标签: java json web-services google-maps casting

我尝试使用Java中的org.JSON解析来自Google GeoCoding API的Json回复。根据API规范,回复流是JSONObject或JSONArray(此处没有问题)。

问题1:但每次,我都必须明确地投射它们(请参阅最后一行;如果我没有给出编译器错误)。它是API的限制还是来自此类Web服务的任何此类Streams?如果可能,请解释为什么我们必须在Java中显式转换。我们必须做的所有情况是什么?

第二季度:无论如何,我可以直接从Web服务的回复流构建JSON树,而不是首先将其读入缓冲区对象(这里我使用了字符串缓冲区),然后构建了JSON树。

对于你的参考: 谷歌的地理编码库

https://developers.google.com/maps/documentation/geocoding/

  • 示例
  • http://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway
  • 输入部分地址
  • OutPut可能的地址匹配列表

    import org.json.JSONArray;  
    import org.json.JSONException;  
    import org.json.JSONObject;  
    public static void main(String[] args) throws JSONException {
    
    String address = getUserInput();        //assert address = "1602+Amphitheatre+Parkway"
    
    String URLString = "http://maps.googleapis.com/maps/api/geocode/json?address=";
    
    String results = fetchSuggestions(URLString, address);      // This has fetched entire reply from Google GeoCode API
    
    
    // parse the Result String to JSON
    JSONObject myJSONResult = new JSONObject(results);
    for (int i = 0; i <((JSONArray) myJSONResult.get("results")).length(); i++) 
        System.out.println(((JSONObject) ((JSONArray) myJSONResult.get("results")).get(i)).get("formatted_address"));
    

    }

1 个答案:

答案 0 :(得分:1)

Q1:有些方法可以为你做类型转换(只需阅读API文档 - http://www.json.org/java/):

JSONArray arr = myJSONResult.getJSONArray("results");
JSONObject obj = arr.getJSONObject(i);

您需要进行类型转换,因为Java(通常,任何OO语言)不能有两个具有相同签名(名称和参数)和不同返回类型的方法,这些方法不在一个层次结构树中。因此,方法get可以返回JSONObjectJSONArray,但是如果没有引用它们的公共父级Object,则无法让一个方法返回这两种类型。它可以通过另一个API设计解决,其中一个类用于数组和对象,但它也不方便。

Q2:是的,但请使用javax.json - http://docs.oracle.com/javaee/7/api/javax/json/package-summary.html。 (您需要下载并安装任何实现并入侵HTTP处理以获取HTTP-body流并传递给库方法:http://docs.oracle.com/javaee/7/api/javax/json/Json.html)。