title: Cannot convert JSON HTTP Response to Java Object using Jackson
body: <p>I have created a REST service which sends GET requests to retrieve a JSON response from a specified URL. </p>
  
  <p>I have got it working to the point where I retrieve the JSON message successfully although my next issue is converting the JSON message to JAVA Objects.</p>
  
  <p>Below is my Rest Client:</p>
  
  <pre><code>public class RestADClient {
  
  
  // HTTP GET request
  public String sendGet(String url) throws Exception {
  
      URL obj = new URL(url);
      HttpURLConnection con = (HttpURLConnection) obj.openConnection();
  
      // optional default is GET
      con.setRequestMethod("GET");
  
      //add request header
  
      con.setRequestProperty("Authorization", "myAuthorizationProp");
  
      int responseCode = con.getResponseCode();
      System.out.println("\nSending 'GET' request to URL : " + url);
      System.out.println("Response Code : " + responseCode);
  
      BufferedReader in = new BufferedReader(
              new InputStreamReader(con.getInputStream()));
      String inputLine;
      StringBuffer response = new StringBuffer();
  
      while ((inputLine = in.readLine()) != null) {
          response.append(inputLine);
      }
      in.close();
  
      System.out.println("Response Message: " + response.toString());
  
      ObjectMapper mapper = new ObjectMapper();
  
      try {
          // Convert JSON string to Object
          String jsonInString = "[{  \"frequency\": \"ONE_MIN\",  \"metricId\": 2253538,  \"metricName\": \"DB|Server:1|IO|Data File Average Read Size\",  \"metricPath\": \"Databases|X|IO|Data File Average Read Size\",  \"metricValues\": [  {    \"count\": 14,    \"current\": 65323,    \"max\": 65536,    \"min\": 0,    \"occurrences\": 0,    \"standardDeviation\": 0,    \"startTimeInMillis\": 1447927800000,    \"sum\": 251408,    \"useRange\": true,    \"value\": 17958  }]}]";
          ADMetrics adMetrics = mapper.readValue(jsonInString, ADMetrics.class);
          System.out.println(adMetrics);
  
      } catch (JsonGenerationException e) {
          e.printStackTrace();
      } catch (JsonMappingException e) {
          e.printStackTrace();
      } catch (IOException e) {
          e.printStackTrace();
      }
  
      return response.toString();
  }
  </code></pre>
  
  <p>}</p>
  
  <p>Below is my ADMetrics POJO class:</p>
  
  <pre><code>import java.util.List;
  public class ADMetrics {
  
  private String frequency;
  private int metricId;
  private String metricName;
  private String metricPath;
  private List&lt;String&gt; metricValues;
  private int count;
  private int current;
  private int max;
  private int min;
  private int occurences;
  private int standardDeviation;
  private int startTimeInMillis;
  private int sum;
  private boolean useRange;
  private int value;
  
  public String getFrequency() {
      return frequency;
  }
  
  public void setFrequency(String frequency) {
      this.frequency = frequency;
  }
  
  public int getMetricId() {
      return metricId;
  }
  
  public void setMetricId(int metricId) {
      this.metricId = metricId;
  }
  public String getMetricName() {
      return metricName;
  }
  
  public void setMetricName(String metricName) {
      this.metricName = metricName;
  }
  
  public String getMetricPath() {
      return metricPath;
  }
  
  public void setMetricPath(String metricPath) {
      this.metricPath = metricPath;
  }
  
  public List&lt;String&gt; getMetricValues() {
      return metricValues;
  }
  
  public void setMetricValues(List&lt;String&gt; metricValues) {
      this.metricValues = metricValues;
  }
  
  public int getCount() {
      return count;
  }
  
  public void setCount(int count) {
      this.count = count;
  }
  
  public int getCurrent() {
      return current;
  }
  
  public void setCurrent(int current) {
      this.current = current;
  }
  
  public int getMax() {
      return max;
  }
  
  public void setMax(int max) {
      this.max = max;
  }
  
  public int getMin() {
      return min;
  }
  
  public void setMin(int min) {
      this.min = min;
  }
  
  public int getOccurences() {
      return occurences;
  }
  
  public void setOccurences(int occurences) {
      this.occurences = occurences;
  }
  
  public int getStandardDeviation() {
      return standardDeviation;
  }
  
  public void setStandardDeviation(int standardDeviation) {
      this.standardDeviation = standardDeviation;
  }
  
  public int getStartTimeInMillis() {
      return startTimeInMillis;
  }
  
  public void setStartTimeInMillis(int startTimeInMillis) {
      this.startTimeInMillis = startTimeInMillis;
  }
  
  public int getSum() {
      return sum;
  }
  
  public void setSum(int sum) {
      this.sum = sum;
  }
  
  public boolean isUseRange() {
      return useRange;
  }
  
  public void setUseRange(boolean useRange) {
      this.useRange = useRange;
  }
  
  public int getValue() {
      return value;
  }
  
  public void setValue(int value) {
      this.value = value;
  }
  </code></pre>
  
  <p>Below is my JUnit test:</p>
  
  <pre><code>public class ADTest {
  
  String url = "myURL";
  
  @Test
  public void testResponseContainsMetricFrequency() throws Exception {
  
      RestADClient restADClient = new RestADClient();
  
  
      assertTrue(restADClient.sendGet(url).contains("frequency"));
  }}
  </code></pre>
  
  <p>When I run the test, I get the following: </p>
  
  <p>Response Code : 200</p>
  
  <p>Response Message: [{  "frequency": "ONE_MIN",  "metricId": 2253538,  "metricName": "DB|Server:169|IO|Data File Average Read Size",  "metricPath": "Databases|QA-CARS|IO|Data File Average Read Size",  "metricValues": [  {    "count": 13,    "current": 66013,    "max": 72003,    "min": 0,    "occurrences": 0,    "standardDeviation": 0,    "startTimeInMillis": 1447929360000,    "sum": 198688,    "useRange": true,    "value": 15284  }]}]</p>
  
  <p>org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of rest.client.ADMetrics out of START_ARRAY token
   at [Source: java.io.StringReader@78b729e6; line: 1, column: 1]</p>