我是REST的新手,并且我正试图稍微习惯它以适应它。我决定创建一个涉及从Google API访问位置数据的小项目。
有许多关于将JSON字符串转换为Java中的对象的帖子,但是大多数帖子似乎使用的库不同于我使用的库,即Jersey。现在,我正在使用Google Maps API成功返回有关用户提供的位置的信息,但是现在,它只返回一个字符串,如下所示:
{
"results" : [
{
"address_components" : [
{
"long_name" : "San Antonio",
"short_name" : "San Antonio",
"types" : [ "locality", "political" ]
},
{
"long_name" : "Bexar County",
"short_name" : "Bexar County",
"types" : [ "administrative_area_level_2", "political" ]
},
{
"long_name" : "Texas",
"short_name" : "TX",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "United States",
"short_name" : "US",
"types" : [ "country", "political" ]
}
],
"formatted_address" : "San Antonio, TX, USA",
"geometry" : {
"bounds" : {
"northeast" : {
"lat" : 29.73872,
"lng" : -98.22295799999999
},
"southwest" : {
"lat" : 29.2241411,
"lng" : -98.8058509
}
},
"location" : {
"lat" : 29.4241219,
"lng" : -98.49362819999999
},
"location_type" : "APPROXIMATE",
"viewport" : {
"northeast" : {
"lat" : 29.73872,
"lng" : -98.22295799999999
},
"southwest" : {
"lat" : 29.2241411,
"lng" : -98.8058509
}
}
},
"place_id" : "ChIJrw7QBK9YXIYRvBagEDvhVgg",
"types" : [ "locality", "political" ]
}
],
"status" : "OK"
}
我需要有一些方法来轻松解析这类信息,我知道Java内置了哈希表。有没有简单的方法来转换这些信息?可能进入某种哈希表?还请包括你转换它的任何对象的用法,所以我可以看到我需要解析它以获取信息的确切方式。这是我到目前为止编写的代码的相关部分。
Client client = ClientBuilder.newClient();
WebTarget target = client.target("https://maps.googleapis.com/maps/api/geocode/json?address=" + loc + "&sensor=false");
String result = target.request(MediaType.TEXT_PLAIN).get(String.class);
感谢任何可以提供帮助的人:)
答案 0 :(得分:1)
在Java中有很多关于将JSON字符串转换为对象的帖子,但是大多数帖子似乎都使用了与我使用的库不同的库,即泽西岛。
基于此,我假设您尝试在Java对象中转换JSON。如果你想继续将一些成员变量存储在HashMaps中,你可以这样做。
首先,您需要为项目提供以下依赖项:
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.25.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.25.1</version>
</dependency>
当前代码中的错误是您期望JSON,而不是text / plain。你也不想要一个String对象,你想要一个相应的POJO。这可能如下所示:
String loc = "New York";
Client client = ClientBuilder.newClient();
client.register(MapperProvider.class);
WebTarget target = client.target("https://maps.googleapis.com/maps/api/geocode/json?address=" + URLEncoder.encode(loc, "UTF-8") + "&sensor=false");
GoogleMapsResponse result = target.request(MediaType.APPLICATION_JSON).get(GoogleMapsResponse.class);
MapperProvider需要强制执行命名策略,主要是JSON的snake_case到Java的camelCase,看起来像这样:
@Provider
public class MapperProvider implements ContextResolver<ObjectMapper> {
final ObjectMapper mapper;
public MapperProvider() {
mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(
PropertyNamingStrategy.SNAKE_CASE);
}
public ObjectMapper getContext(Class<?> aClass) {
return mapper;
}
}
GoogleMaps类的开头是
public class GoogleMapsResponse {
public Result[] results;
public String status;
}
结果必须包含AddressComponent数组,其中AddressComponent类包含String longName,String shortName a Type数组等。
这取决于您建模和实施