gpt4 book ai didi

java - 在解析 JSON 或 Web 服务响应时,为什么我们要在 Java 中显式转换?

转载 作者:行者123 更新时间:2023-12-01 11:42:06 27 4
gpt4 key购买 nike

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

Q1:但每次,我都必须显式地转换它们(请参阅最后一行;如果我不这样做,则会出现编译器错误)。这是 API 或来自此类 Web 服务的任何此类流的限制吗?如果可能的话,请解释一下为什么我们必须在 Java 中显式转换。在什么情况下我们必须这样做?

Q2:我是否可以直接从 Web 服务的回复流构建 JSON 树,而不是先将其读入缓冲区对象(这里我使用 String Buffer),然后再构建 JSON 树。

供您引用:Google 的地理编码库

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

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

    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"));

    }

最佳答案

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

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

您需要类型转换,因为 Java(一般来说,任何 OO 语言)不能有两个具有相同签名(名称和参数)和不同返回类型的方法,而这两个方法不在一个层次结构树中。因此,方法 get 可以返回 JSONObjectJSONArray,但不可能有一个方法在不引用其共同父级的情况下返回这两种类型 - 对象。这个问题可以通过另一种 API 设计来解决,使用一个数组和对象类,但也不太方便。

问题2:是的,但使用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 )。

关于java - 在解析 JSON 或 Web 服务响应时,为什么我们要在 Java 中显式转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29442971/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com