如何使用Jersey库将JSON字符串转换为Java中更易解析的内容?

时间:2017-09-11 20:46:18

标签: java json rest jersey

我是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);

感谢任何可以提供帮助的人:)

1 个答案:

答案 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数组等。

这取决于您建模和实施