title: Changing from Gson to Jackson for JSON parsing
body: <p>Im currently using GSON to parse a pretty big JSONfile using an inputstream/reader. 
  The parsing takes about 35 seconds on my android device, i understood from some benchmark test that Jackson performance is way better. But i can't find out how to parse my JSON file using jackson. Can anyone help me?</p>
  
  <p>My JSON looks like this:</p>
  
  <pre><code>[
  
      {
          "venue": { … }
      },
      {
          "venue": {
              "venue_seasons": [ … ],
              "address": "the address",
              "city": "the city",
              "name": "the name",
              "created_at": "2011-05-31T07:55:33Z",
              "latitude": 00.000000,
              "country": "the country",
              "internal_link_en": null,
              "internal_link_nl": null,
              "updated_at": "2011-09-15T14:46:09Z",
              "zipcode": "the zipcode",
              "foursquare_link": "foursquare url",
              "url": null,
              "id": 3,
              "tip": "some tip",
              "uid": "4ab5e205f964a520317620e3",
              "phone": "phonenr",
              "recommended": null,
              "website": "someurl",
              "venue_photos": [ … ],  //array containing objects with urls of images
              "description": null,
              "longitude": 00.000000,
              "thumbnail_location": null,
              "subcategories": [ … ],
              "opening_en": null,
              "opening_nl": null,
              "hidden": false,
              "twitter": "thetwitteraccount",
              "themes": [ … ]
          }
      }, //more venues
  ]
  </code></pre>
  
  <p>My GSON code looks like this, it works:</p>
  
  <pre><code>AssetManager assetManager = getAssets();
  InputStream inputStream = null;
  try {
      inputStream = assetManager.open("filename.json");
  } catch (IOException e) {
      Log.e("tag", e.getMessage());
  }
  
  Reader reader = new InputStreamReader(inputStream);
  
  Gson gson = new Gson();
  List&lt;JsonResponse&gt; venueList = gson.fromJson(reader, new TypeToken&lt;List&lt;JsonResponse&gt;&gt;() {}.getType());
  JsonResponse naam = venueList.get(12);
  String denaam = naam.venue.getName;
  Log.i("nr12",denaam);
  Log.i("timetracker","stop" ); 
  
  // just some logging to test if the parser works 
  for (JsonResponse venue : venueList) {
      String tijdel = String.valueOf(venue.venue.id);
      Log.i(venuetag,"name of venue"+ tijdel+ " is: " + venue.venue.getName);
  }
  
  ...
  
  class JsonResponse
  {
      Venues venue;
  }
  
  class Venues
  {
      public List&lt;VenueSeasons&gt; venue_seasons;
  
      public List&lt;VenuePhotos&gt; venue_photos;
  
      public List&lt;SubCategories&gt; subcategories;
  
      public List&lt;Themes&gt; themes;
  
      @SerializedName("address")
      public String getAdress;
  
      @SerializedName("city")
      public String getCity;
  
      @SerializedName("country")
      public String getCountry;
  
      @SerializedName("name")
      public String getName;
  
      @SerializedName("created_at")
      public Date getCreatedAt;
  
      @SerializedName("updated_at")
      public Date getUpdatedAt;
  
      @SerializedName("internal_link_nl")
      public String getInternalLinkNl;
  
      @SerializedName("internal_link_en")
      public String getInternalLinkEN;
  
      @SerializedName("latitude")
      public Double getLatitude;
  
      @SerializedName("longitude")
      public Double getLongitude;
  
      @SerializedName("foursquare_link")
      public String getFoursquareLink;
  
      @SerializedName("url")
      public String getURL;
  
      @SerializedName("phone")
      public String getPhone;
  
      @SerializedName("zipcode")
      public String getZipCode;
  
      public String tip;
  
      public String tip_en;
  
      public String uid;
  
      public int id;
  
      @SerializedName("website")
      public String getWebsite;
  
      @SerializedName("recommended")
      public Boolean getRecommended;
  
      @SerializedName("description")
      public String getDescription;
  
      @SerializedName("hidden")
      public Boolean getHidden;
  
      @SerializedName("opening_en")
      public String getOpeningEN;
  
      @SerializedName("opening_nl")
      public String getOpeningNL;
  
      @SerializedName("twitter")
      public String getTwitter;
  
      @SerializedName("thumbnail_location")
      public String getThumbnailLocation;
  }
  
  
  public class VenuePhotos 
  {
      @SerializedName("large")
      public String getLargePhotoURL;
  
      @SerializedName("medium")
      public String getMediumPhotoURL;
  
      @SerializedName("small")
      public String getSmallPhotoURL; 
  
      @SerializedName("original")
      public String getOriginalPhotoURL;
  
      public String uid;
  
      public int id;
  
      public int venue_id;
  
      public boolean selected;
  
      @SerializedName("created_at")
      public Date getCreatedAt;
  
      @SerializedName("updated_at")
      public Date getUpdatedAt;
  }
  </code></pre>
  
  <p>Now this works. I did some stuff with the data and after parsing it works all awesome, but I think it sucks the startup of my app takes so long.</p>
  
  <p>My Jackson code (the failing one) is:</p>
  
  <pre><code>AssetManager assetManager = getAssets();
  InputStream inputStream = null;
  try {
      inputStream = assetManager.open("originalDelftJson.json");
  } catch (IOException e) {
      Log.e("tag", e.getMessage());
  }
  Reader reader = new InputStreamReader(inputStream);
  
  ObjectMapper objectMapper = new ObjectMapper();
  JsonFactory jsonFactory = new JsonFactory();
  JJsonResponse response = null;
  try {
      JsonParser jp = jsonFactory.createJsonParser(reader);
      response = objectMapper.readValue(jp, JJsonResponse.class);
      String test = String.valueOf(response.venue.size());
  </code></pre>
  
  <p>With classes:</p>
  
  <pre><code>public class JJsonResponse
  {
       public List&lt;JVenue&gt; venue;
  }
  
  class Venues
  {
      public List&lt;VenueSeasons&gt; venue_seasons;
  
      public List&lt;VenuePhotos&gt; venue_photos;
  
      public List&lt;SubCategories&gt; subcategories;
  
      public List&lt;Themes&gt; themes;
  
      @SerializedName("address")
      public String getAdress;
  
      @SerializedName("city")
      public String getCity;
  
      @SerializedName("country")
      public String getCountry;
  
      @SerializedName("name")
      public String getName;
  
      @SerializedName("created_at")
      public Date getCreatedAt;
  
      @SerializedName("updated_at")
      public Date getUpdatedAt;
  
      @SerializedName("internal_link_nl")
      public String getInternalLinkNl;
  
      @SerializedName("internal_link_en")
      public String getInternalLinkEN;
  
      @SerializedName("latitude")
      public Double getLatitude;
  
      @SerializedName("longitude")
      public Double getLongitude;
  
      @SerializedName("foursquare_link")
      public String getFoursquareLink;
  
      @SerializedName("url")
      public String getURL;
  
      @SerializedName("phone")
      public String getPhone;
  
      @SerializedName("zipcode")
      public String getZipCode;
  
      public String tip;
  
      public String tip_en;
  
      public String uid;
  
      public int id;
  
      @SerializedName("website")
      public String getWebsite;
  
      @SerializedName("recommended")
      public Boolean getRecommended;
  
      @SerializedName("description")
      public String getDescription;
  
      @SerializedName("hidden")
      public Boolean getHidden;
  
      @SerializedName("opening_en")
      public String getOpeningEN;
  
      @SerializedName("opening_nl")
      public String getOpeningNL;
  
      @SerializedName("twitter")
      public String getTwitter;
  
      @SerializedName("thumbnail_location")
      public String getThumbnailLocation;
  }
  
  public class JVenue
  {
      public String name;
      public int id;
      public String city;
      public String address;
      public String country;
      public String internal_link_nl;
      public String internal_link_en;
      public String zipcode;
      public String foursquare_link;
      public String tip_en;
      public String url;
      public Date created_at;
      public Date updated_at;
      public float latitude;
      public float longitude;
      public String tip;
      public String uid;
      public String phone;
      public String recommended;
      public String website;
      public String description;
      public String thumbnail_location;
      public boolean hidden;
      public String twitter;
      public String opening_en;
      public String opening_nl;
  }
  </code></pre>
  
  <p>I think I am pretty close, but im doing something wrong because i get the error: <code>org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of com.jacksonrecipes.testapp.model.JJsonResponse out of START_ARRAY token</code></p>
  
  <p>I don't really get how Jackson works and how to implement it. Does anyone know how to change my Jackson implementation in my Android code so it will work and I can access the data?</p>
  
  <p><strong>edit: got my solution</strong> </p>
  
  <p>With help of the answer of MH. i could find it. I now use:</p>
  
  <pre><code>List&lt;JJsonResponse&gt; venueCounter = objectMapper.readValue(inputStream, new TypeReference&lt;List&lt;JJsonResponse&gt;&gt;() { });
  </code></pre>