Java解析含字符串与浮点数的JSON文件实现邮编查坐标
Java解析邮编坐标JSON并实现查询功能
我刚好有一套完整的实现方案,能满足你用Java解析指定JSON文件、输入字符串邮编获取对应坐标的需求。先看看我们要处理的JSON结构:
{"11542": [40.870932001722714, -73.62889780791781], "54548": [45.859817510232425, -89.82102639934573], "11547": [40.83072033793459, -73.6445076194238]}
这里必须重点说一下TypeToken的作用——它简直是Gson处理泛型的救星!因为Java的泛型擦除机制,直接给Gson传Map.class的话,它没法识别出Map<String, Double[]>这种具体的泛型结构,而TypeToken可以帮我们保留住泛型的具体类型信息,让Gson准确解析出我们需要的键值对结构。
下面是完整的实现代码:
import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.util.Map; public class ZipCodeLookup { public class ZipCodeResult { final double longitude; final double latitude; public ZipCodeResult(double longitude, double latitude) { this.longitude = longitude; this.latitude = latitude; } public double getLongitude() { return longitude; } public double getLatitude() { return latitude; } } public Map<String, Double[]> lookups; public ZipCodeLookup(InputStream is) throws IOException { Gson gson = new Gson(); Reader reader = new InputStreamReader(is); // 这里TypeToken帮我们保留了Map<String, Double[]>的泛型信息 lookups = gson.fromJson(reader, new TypeToken<Map<String, Double[]>>() {}.getType()); reader.close(); } public ZipCodeResult lookupZipcode(String zipcode) { Double[] values = lookups.get(zipcode); return (values == null) ? null : new ZipCodeResult(values[0], values[1]); } }
你可以这样来使用这个类:
import java.io.FileInputStream; import java.io.IOException; public class Main { public static void main(String[] args) { try (FileInputStream fis = new FileInputStream("your-zip-file.json")) { ZipCodeLookup lookup = new ZipCodeLookup(fis); ZipCodeLookup.ZipCodeResult result = lookup.lookupZipcode("11542"); if (result != null) { System.out.println("纬度: " + result.getLatitude() + ", 经度: " + result.getLongitude()); } else { System.out.println("未找到该邮编对应的坐标"); } } catch (IOException e) { e.printStackTrace(); } } }
内容的提问来源于stack exchange,提问作者drillau
相关产品推荐
相关产品推荐

