Untitled

 avatar
unknown
plain_text
16 days ago
13 kB
4
Indexable
package sth.nns.clientservice.util;

import sth.json.JSON;
import sth.nns.clientservice.model.*;

import java.util.ArrayList;
import java.util.List;

/**
 * Utility class for deserializing JSON responses into model objects.
 */
public class NnsJsonDeserializer {

    /**
     * Deserializes a JSON response into a RecommendationsResponse object.
     * 
     * @param json The JSON response from the NNS API
     * @return A RecommendationsResponse object
     */
    public static RecommendationsResponse deserializeRecommendationsResponse(JSON json) {
        if (json == null) {
            return null;
        }
        
        RecommendationsResponse response = new RecommendationsResponse();
        
        // Set basic fields
        response.setType(getStringValue(json, "type"));
        response.setUiHint(getStringValue(json, "uiHint"));
        response.setVodOutOfWindow(getBooleanValue(json, "vodOutOfWindow"));
        response.setName(getStringValue(json, "name"));
        response.setTwcTvNetworkDisplayMode(getStringValue(json, "twcTvNetworkDisplayMode"));
        response.setNum_categories(getIntValue(json, "num_categories"));
        response.setTotal_results(getIntValue(json, "total_results"));
        response.setStart_index(getIntValue(json, "start_index"));
        response.setNum_results(getIntValue(json, "num_results"));
        response.setMax_results(getIntValue(json, "max_results"));
        response.setDsQueryId(getStringValue(json, "dsQueryId"));
        response.setCurationType(getStringValue(json, "curationType"));
        response.setSkeletonShelf(getBooleanValue(json, "skeletonShelf"));
        
        // Process dynamic URIs
        if (json.hasField("dynamicUris")) {
            JSON dynamicUrisJson = json.get("dynamicUris");
            List<String> dynamicUris = new ArrayList<>();
            for (int i = 0; i < dynamicUrisJson.size(); i++) {
                dynamicUris.add(dynamicUrisJson.get(i).toString());
            }
            response.setDynamicUris(dynamicUris);
        }
        
        // Process results
        if (json.hasField("results")) {
            JSON resultsJson = json.get("results");
            List<r> results = new ArrayList<>();
            
            for (int i = 0; i < resultsJson.size(); i++) {
                JSON resultJson = resultsJson.get(i);
                String type = getStringValue(resultJson, "type");
                
                if ("event".equals(type)) {
                    results.add(deserializeEvent(resultJson));
                } else if ("episode_list".equals(type)) {
                    results.add(deserializeEpisodeList(resultJson));
                }
            }
            
            response.setResults(results);
        }
        
        return response;
    }
    
    /**
     * Deserializes a JSON object into an Event object.
     * 
     * @param json The JSON object
     * @return An Event object
     */
    public static Event deserializeEvent(JSON json) {
        if (json == null) {
            return null;
        }
        
        Event event = new Event();
        
        // Set base fields from Result
        populateResultFields(event, json);
        
        // Set event-specific fields
        if (json.hasField("tmsProgramIds")) {
            event.setTmsProgramIds(deserializeStringList(json.get("tmsProgramIds")));
        }
        
        if (json.hasField("providerAssetIds")) {
            event.setProviderAssetIds(deserializeStringList(json.get("providerAssetIds")));
        }
        
        if (json.hasField("tmsGuideServiceIds")) {
            event.setTmsGuideServiceIds(deserializeStringList(json.get("tmsGuideServiceIds")));
        }
        
        if (json.hasField("ipTmsGuideServiceIds")) {
            event.setIpTmsGuideServiceIds(deserializeStringList(json.get("ipTmsGuideServiceIds")));
        }
        
        if (json.hasField("streamList")) {
            event.setStreamList(deserializeStringList(json.get("streamList")));
        }
        
        // Process details
        if (json.hasField("details")) {
            event.setDetails(deserializeEventDetails(json.get("details")));
        }
        
        return event;
    }
    
    /**
     * Deserializes a JSON object into an EpisodeList object.
     * 
     * @param json The JSON object
     * @return An EpisodeList object
     */
    public static EpisodeList deserializeEpisodeList(JSON json) {
        if (json == null) {
            return null;
        }
        
        EpisodeList episodeList = new EpisodeList();
        
        // Set base fields from Result
        populateResultFields(episodeList, json);
        
        // Set episode list-specific fields
        episodeList.setTmsSeriesId(getStringValue(json, "tmsSeriesId"));
        episodeList.setTmsSeriesIdStr(getStringValue(json, "tmsSeriesIdStr"));
        
        if (json.hasField("tmsGuideServiceIds")) {
            episodeList.setTmsGuideServiceIds(deserializeStringList(json.get("tmsGuideServiceIds")));
        }
        
        if (json.hasField("ipTmsGuideServiceIds")) {
            episodeList.setIpTmsGuideServiceIds(deserializeStringList(json.get("ipTmsGuideServiceIds")));
        }
        
        // Process details
        if (json.hasField("details")) {
            episodeList.setDetails(deserializeEpisodeListDetails(json.get("details")));
        }
        
        return episodeList;
    }
    
    /**
     * Deserializes a JSON object into an EventDetails object.
     * 
     * @param json The JSON object
     * @return An EventDetails object
     */
    private static EventDetails deserializeEventDetails(JSON json) {
        if (json == null) {
            return null;
        }
        
        EventDetails details = new EventDetails();
        
        details.setOriginal_air_date(getStringValue(json, "original_air_date"));
        details.setYear(getStringValue(json, "year"));
        details.setEntitled(getBooleanValue(json, "entitled"));
        details.setTvodEntitled(getBooleanValue(json, "tvodEntitled"));
        details.setLinearEntitledIp(getBooleanValue(json, "linearEntitledIp"));
        details.setLinearEntitledQam(getBooleanValue(json, "linearEntitledQam"));
        
        // Process genres
        if (json.hasField("genres")) {
            JSON genresJson = json.get("genres");
            List<Genre> genres = new ArrayList<>();
            
            for (int i = 0; i < genresJson.size(); i++) {
                JSON genreJson = genresJson.get(i);
                Genre genre = new Genre();
                genre.setName(getStringValue(genreJson, "name"));
                genres.add(genre);
            }
            
            details.setGenres(genres);
        }
        
        // Process ratings
        if (json.hasField("allRatings")) {
            details.setAllRatings(deserializeStringList(json.get("allRatings")));
        }
        
        // Process VPPs
        if (json.hasField("allVPPs")) {
            details.setAllVPPs(deserializeStringList(json.get("allVPPs")));
        }
        
        // Process IP VPPs
        if (json.hasField("allIpVPPs")) {
            details.setAllIpVPPs(deserializeStringList(json.get("allIpVPPs")));
        }
        
        // Process program metadata (placeholder)
        if (json.hasField("programMetadata")) {
            details.setProgramMetadata(new ProgramMetadata());
        }
        
        return details;
    }
    
    /**
     * Deserializes a JSON object into an EpisodeListDetails object.
     * 
     * @param json The JSON object
     * @return An EpisodeListDetails object
     */
    private static EpisodeListDetails deserializeEpisodeListDetails(JSON json) {
        if (json == null) {
            return null;
        }
        
        EpisodeListDetails details = new EpisodeListDetails();
        
        details.setNum_assets(getIntValue(json, "num_assets"));
        details.setTotalEpisodes(getIntValue(json, "totalEpisodes"));
        details.setEntitled(getBooleanValue(json, "entitled"));
        details.setTvodEntitled(getBooleanValue(json, "tvodEntitled"));
        details.setLinearEntitledIp(getBooleanValue(json, "linearEntitledIp"));
        details.setLinearEntitledQam(getBooleanValue(json, "linearEntitledQam"));
        
        // Process latest episode
        if (json.hasField("latest_episode")) {
            details.setLatest_episode(deserializeEvent(json.get("latest_episode")));
        }
        
        // Process ratings
        if (json.hasField("allRatings")) {
            details.setAllRatings(deserializeStringList(json.get("allRatings")));
        }
        
        // Process VPPs
        if (json.hasField("allVPPs")) {
            details.setAllVPPs(deserializeStringList(json.get("allVPPs")));
        }
        
        // Process IP VPPs
        if (json.hasField("allIpVPPs")) {
            details.setAllIpVPPs(deserializeStringList(json.get("allIpVPPs")));
        }
        
        return details;
    }
    
    /**
     * Populates the base Result fields from a JSON object.
     * 
     * @param result The Result object to populate
     * @param json The JSON object containing the values
     */
    private static void populateResultFields(Result result, JSON json) {
        result.setType(getStringValue(json, "type"));
        result.setAlphaSortOn(getStringValue(json, "alphaSortOn"));
        result.setAvailableOutOfHome(getBooleanValue(json, "availableOutOfHome"));
        result.setLinearAvailableOutOfHome(getBooleanValue(json, "linearAvailableOutOfHome"));
        result.setLinearAvailableInMarket(getBooleanValue(json, "linearAvailableInMarket"));
        result.setVodAvailableOutOfHome(getBooleanValue(json, "vodAvailableOutOfHome"));
        result.setTvodAvailableOutOfHome(getBooleanValue(json, "tvodAvailableOutOfHome"));
        result.setCdvrAvailableOutOfHome(getBooleanValue(json, "cdvrAvailableOutOfHome"));
        result.setVodOutOfWindow(getBooleanValue(json, "vodOutOfWindow"));
        result.setImage_uri(getStringValue(json, "image_uri"));
        result.setNetwork(getStringValue(json, "network"));
        result.setTitle(getStringValue(json, "title"));
        result.setTitleWithoutArticles(getStringValue(json, "titleWithoutArticles"));
        result.setUri(getStringValue(json, "uri"));
        result.setSkeletonShelf(getBooleanValue(json, "skeletonShelf"));
    }
    
    /**
     * Deserializes a JSON array into a list of strings.
     * 
     * @param json The JSON array
     * @return A list of strings
     */
    private static List<String> deserializeStringList(JSON json) {
        List<String> result = new ArrayList<>();
        
        if (json != null && json.isArray()) {
            for (int i = 0; i < json.size(); i++) {
                result.add(json.get(i).toString());
            }
        }
        
        return result;
    }
    
    /**
     * Safely gets a string value from a JSON object.
     * 
     * @param json The JSON object
     * @param field The field name
     * @return The string value, or null if not present
     */
    private static String getStringValue(JSON json, String field) {
        if (json == null || !json.hasField(field)) {
            return null;
        }
        
        Object value = json.get(field);
        return value != null ? value.toString() : null;
    }
    
    /**
     * Safely gets a boolean value from a JSON object.
     * 
     * @param json The JSON object
     * @param field The field name
     * @return The boolean value, or false if not present
     */
    private static boolean getBooleanValue(JSON json, String field) {
        if (json == null || !json.hasField(field)) {
            return false;
        }
        
        Object value = json.get(field);
        if (value instanceof Boolean) {
            return (Boolean) value;
        } else if (value != null) {
            return Boolean.parseBoolean(value.toString());
        }
        
        return false;
    }
    
    /**
     * Safely gets an integer value from a JSON object.
     * 
     * @param json The JSON object
     * @param field The field name
     * @return The integer value, or 0 if not present
     */
    private static int getIntValue(JSON json, String field) {
        if (json == null || !json.hasField(field)) {
            return 0;
        }
        
        Object value = json.get(field);
        if (value instanceof Number) {
            return ((Number) value).intValue();
        } else if (value != null) {
            try {
                return Integer.parseInt(value.toString());
            } catch (NumberFormatException e) {
                return 0;
            }
        }
        
        return 0;
    }
}
Editor is loading...
Leave a Comment