code: private Polygon parsePolygon(JsonParser jp) throws IOException, SQLException {
          jp.nextToken(); // FIELD_NAME coordinates        
          String coordinatesField = jp.getText();
          if (coordinatesField.equalsIgnoreCase(GeoJsonField.COORDINATES)) {
              jp.nextToken(); // START_ARRAY [ coordinates
              jp.nextToken(); //Start the RING
              int linesIndex = 0;
              LinearRing linearRing = null;
              ArrayList<LinearRing> holes = new ArrayList<LinearRing>();
              while (jp.getCurrentToken() != JsonToken.END_ARRAY) {
                  if (linesIndex == 0) {
                      linearRing = GF.createLinearRing(parseCoordinates(jp));
                  } else {
                      holes.add(GF.createLinearRing(parseCoordinates(jp)));
                  }
                  jp.nextToken();//END RING
                  linesIndex++;
              }
              if (linesIndex > 1) {
                  jp.nextToken();//END_OBJECT } geometry
                  return GF.createPolygon(linearRing, holes.toArray(new LinearRing[0]));
              } else {
                  jp.nextToken();//END_OBJECT } geometry
                  return GF.createPolygon(linearRing, null);
              }
          } else {
              throw new SQLException("Malformed GeoJSON file. Expected 'coordinates', found '" + coordinatesField + "'");
          }
      }
docs: Coordinates of a Polygon are an array of LinearRing coordinate arrays.
  The first element in the array represents the exterior ring. Any
  subsequent elements represent interior rings (or holes).
  
  Syntax:
  
  No holes:
  
  { "type": "Polygon", "coordinates": [ [ [100.0, 0.0], [101.0, 0.0],
  [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ] ] }
  
  With holes:
  
  { "type": "Polygon", "coordinates": [ [ [100.0, 0.0], [101.0, 0.0],
  [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ], [ [100.2, 0.2], [100.8, 0.2],
  [100.8, 0.8], [100.2, 0.8], [100.2, 0.2] ] ] }
  
  
  
  @param jp
  @return Polygon