jsonapizohozoho-deluge

Accessing specific JSON values in a deluge script


I have a JSON API response that contains multiple entries, with different types of subscriptions and multiple users.

I need to search the list for a "user_name" AND a "subscription", then return any matching "duration". In some cases, there will be more than one "duration" for a user and subscription. I would need the total (sum) of the duration when there is more than one.

For example, here is a part of an example Json I am working with:

[
    {
        "id": 139387026,
        "user_name": "John Smith",
        "note": "",
        "last_modify": "2022-03-28 14:16:35",
        "date": "2022-03-28",
        "locked": "0",
        "addons_external_id": "",
        "description": "",
        "info": [
            {
                "subscription": "basic",
                "duration": "22016",
            }
        ]
    },
    {
        "id": 139387027,
        "user_name": "John Smith",
        "note": "",
        "last_modify": "2022-03-28 14:16:35",
        "date": "2022-03-28",
        "locked": "0",
        "addons_external_id": "",
        "description": "",
        "info": [
            {
                "subscription": "advanced",
                "duration": "10537",
            }
        ]
    },
    {
        "id": 139387028,
        "user_name": "Martin Lock",
        "note": "",
        "last_modify": "2022-03-28 14:16:35",
        "date": "2022-03-28",
        "locked": "0",
        "addons_external_id": "",
        "description": "",
        "info": [
            {
                "subscription": "basic",
                "duration": "908",
            }
        ]
    },
]
 

So for example, for user_name: "John Smith" and subscription: "advanced", I need to return duration: "10537".

I've used toJsonlist(); to convert it, then used the code below, but it returns all values in the list. I can't figure out how to search for the specific values or add matching entries together.

rows = subscriptions.toJsonlist();
for each  row in rows
{
    info row;
    user_name = row.getJson("user_name");
    info "username: " + user_name;
    subscription = row.getJson("subscription");
    info "subscription: " + subscription;
    subscriptionId = row.getJson("subscriptionId");
    info "subscription Id: " + subscriptionId;
}

I'm fairly new to programming. Any help is appreciated!


Solution

  • According to your needs , you want to filter your JSON data and get the corresponding value from your filter in user_name and subcription. Here is the Deluge Script for that. I use clear variable name so that it will not confused you.

    //Your Entry Change this based on your filter
    input_user_name = "John Smith";
    input_subscription = "advanced";
    
    
    //Your JSON data
    json_string_data = '[ { "id": 139387026, "user_name": "John Smith", "note": "", "last_modify": "2022-03-28 14:16:35", "date": "2022-03-28", "locked": "0", "addons_external_id": "", "description": "", "info": [ { "subscription": "basic", "duration": "22016", } ] }, { "id": 139387027, "user_name": "John Smith", "note": "", "last_modify": "2022-03-28 14:16:35", "date": "2022-03-28", "locked": "0", "addons_external_id": "", "description": "", "info": [ { "subscription": "advanced", "duration": "10537", } ] }, { "id": 139387028, "user_name": "Martin Lock", "note": "", "last_modify": "2022-03-28 14:16:35", "date": "2022-03-28", "locked": "0", "addons_external_id": "", "description": "", "info": [ { "subscription": "basic", "duration": "908", } ] } ]';
    //Declare the data as JSON
    processed_json_data = json_string_data.toJsonlist();
    
    
    initial_total_duration = 0;//Donot change this
    list_of_duration = List();
    total_duration_per_username_per_subscription = Map();
    for each row in processed_json_data
    {
        if (row.get("user_name") == input_user_name )
        {
            info_list = row.get("info").toJSONList();
            for each info_row in info_list
            {
                if (info_row.get("subscription") == input_subscription)
                {
                    info_row_duration = info_row.get("duration").toLong(); // make it integer
                    list_of_duration.add(info_row_duration);
                }
            }
        }
    }
    result_map = Map();
    //Sum of list_of_duration
    for each duration in list_of_duration
    {
        initial_total_duration = initial_total_duration + duration;
    }
    result_map.put("user_name",input_user_name);
    result_map.put("subscription",input_subscription);
    result_map.put("no_of_subscription",list_of_duration.size());
    result_map.put("total_duration",initial_total_duration);
    info result_map;
    

    And the result should be

    {"user_name":"John Smith","subscription":"advanced","no_of_subscription":1,"total_duration":10537}
    

    You can test these script in https://deluge.zoho.com/tryout.

    Thanks, Von