private static void parseCoreCache(final ObjectNode response, @NonNull final Geocache cache) {
        cache.setGeocode(response.get(CACHE_CODE).asText());
        cache.setName(response.get(CACHE_NAME).asText());
        // not used: names
        setLocation(cache, response.get(CACHE_LOCATION).asText());
        cache.setType(getCacheType(response.get(CACHE_TYPE).asText()));

        final String status = response.get(CACHE_STATUS).asText();
        cache.setDisabled(status.equalsIgnoreCase(CACHE_STATUS_DISABLED));
        cache.setArchived(status.equalsIgnoreCase(CACHE_STATUS_ARCHIVED));

        cache.setSize(getCacheSize(response));
        cache.setDifficulty((float) response.get(CACHE_DIFFICULTY).asDouble());
        cache.setTerrain((float) response.get(CACHE_TERRAIN).asDouble());

        cache.setInventoryItems(response.get(CACHE_TRACKABLES_COUNT).asInt());

        final String region = response.get(CACHE_REGION) == null ? null : response.get(CACHE_REGION).asText();
        final String country = response.get(CACHE_COUNTRY) == null ? null : response.get(CACHE_COUNTRY).asText();
        cache.setLocation(region == null ? country : (country == null ? region : region + ", " + country));

        if (response.has(CACHE_IS_FOUND)) {
            cache.setFound(response.get(CACHE_IS_FOUND).asBoolean());
        }
        if (response.has(CACHE_IS_WATCHED)) {
            cache.setOnWatchlist(response.get(CACHE_IS_WATCHED).asBoolean());
        }
        if (response.has(CACHE_IS_RECOMMENDED)) {
            cache.setFavorite(response.get(CACHE_IS_RECOMMENDED).asBoolean());
        }
        cache.setHidden(parseDate(response.get(CACHE_HIDDEN).asText()));

        final String owner = parseUser(response.get(CACHE_OWNER));
        cache.setOwnerDisplayName(owner);
        // OpenCaching has no distinction between user id and user display name. Set the ID anyway to simplify c:geo workflows.
        cache.setOwnerUserId(owner);
        final String profile = response.get(CACHE_OWNER).get(CACHE_USER_PROFILE).asText();
        if (StringUtils.isNotEmpty(profile)) {
            final String id = StringUtils.substringAfter(profile, "userid=");
            if (StringUtils.isNotEmpty(id)) {
                cache.setOwnerUserId(id);
            }
        }

        final Map<LogType, Integer> logCounts = cache.getLogCounts();
        logCounts.put(LogType.FOUND_IT, response.get(CACHE_FOUNDS).asInt());
        logCounts.put(LogType.DIDNT_FIND_IT, response.get(CACHE_NOTFOUNDS).asInt());
        // only current Api
        logCounts.put(LogType.WILL_ATTEND, response.path(CACHE_WILLATTENDS).asInt());
        cache.setLogCounts(logCounts);

        if (response.has(CACHE_RATING)) {
            cache.setRating((float) response.get(CACHE_RATING).asDouble());
        }
        cache.setVotes(response.get(CACHE_VOTES).asInt());

        cache.setFavoritePoints(response.get(CACHE_RECOMMENDATIONS).asInt());

        //set basic properties which are constant / not used for OC platforms
        cache.setPremiumMembersOnly(false);
        cache.setUserModifiedCoords(false);

        cache.setAttributes(parseAttributes((ArrayNode) response.path(CACHE_ATTRNAMES), (ArrayNode) response.get(CACHE_ATTR_ACODES)));

        DataStore.saveCache(cache, EnumSet.of(SaveFlag.CACHE));
    }
returns list of parsed geocaches (left) and a floag indicating whether there are more results on serer (right)
main/src/main/java/cgeo/geocaching/connector/oc/OkapiClient.java