Mahendra Vengalam
Mahendra Vengalam

Reputation: 73

How to read Json data using python?

I have the response message below and code which I follow

result= a["{\"msg\":\"result\",\"id\”:\”test\”,\”result\":{\"categories\":[\"<20M\",\"20M+\",\"50M+\",\"300M+\",\"1G\"],\"series\":[{\"name\":\"Fiber\",\"data\":[216,41,10393,37394,6016]}],\"totals\":{\"<20M\":216,\"20M+\":41,\"50M+\":10393,\"300M+\":37394,\"1G\":6016}}}"]

#Remove a
     sliceresult=result[1:]
    print('Result After slice: {}'.format(sliceresult))
    string_input = ''.join(str(s) for s in sliceresult)
    print(string_input)
    category = json.loads(string_input)['result']['categories']
    series = json.loads(string_input)['result']['series']
    total = json.loads(string_input)['result']['totals']
    print(category, series, total)
    Error Response was:
        category = json.loads(result[1:])['result']['categories']
    TypeError: list indices must be integers, not str

Upvotes: 0

Views: 83

Answers (2)

dragons_kee
dragons_kee

Reputation: 1

import json
from collections import Counter
from typing import Dict, Tuple, List, Counter as CounterType

def calculate_user_activity(data: Dict) -> CounterType:
    return Counter(action['user'] for action in data['activities'])

def get_most_active_user(user_activity: CounterType) -> Dict:
    most_active_user = user_activity.most_common(1)[0]
    return {
        'name': most_active_user[0],
        'action_count': most_active_user[1]
    }

def get_user_activity_percentage(user_activity: CounterType) -> float:
    total_actions = sum(user_activity.values())
    most_active_user = user_activity.most_common(1)[0]
    return round((most_active_user[1] / total_actions) * 100, 2)

def get_total_actions(user_activity: CounterType) -> int:
    return sum(user_activity.values())

def get_unique_users_count(user_activity: CounterType) -> int:
    return len(user_activity)

def get_all_users_ranked(user_activity: CounterType) -> List[Tuple[str, int]]:
    return user_activity.most_common()

def get_average_actions_per_user(user_activity: CounterType) -> float:
    total_actions = sum(user_activity.values())
    unique_users = len(user_activity)
    return round(total_actions / unique_users, 2)

def get_median_actions_per_user(user_activity: CounterType) -> int:
    actions_per_user = sorted(user_activity.values())
    length = len(actions_per_user)
    
    if length % 2 == 0:
        middle1 = actions_per_user[length // 2 - 1]
        middle2 = actions_per_user[length // 2]
        return (middle1 + middle2) // 2
    else:
        return actions_per_user[length // 2]

def analyze_user_data(file_path: str) -> Dict:
    try:
        with open(file_path, 'r') as file:
            data = json.load(file)
            
        user_activity = calculate_user_activity(data)
        
        return {
            'most_active_user': get_most_active_user(user_activity),
            'most_active_user_percentage': get_user_activity_percentage(user_activity),
            'total_actions': get_total_actions(user_activity),
            'unique_users': get_unique_users_count(user_activity),
            'all_users_ranked': get_all_users_ranked(user_activity),
            'average_actions_per_user': get_average_actions_per_user(user_activity),
            'median_actions_per_user': get_median_actions_per_user(user_activity)
        }
        
    except FileNotFoundError:
        return "Error: File not found"
    except json.JSONDecodeError:
        return "Error: Invalid JSON format"
    except Exception as e:
        return f"Error: {str(e)}"

# Example usage with sample data
if __name__ == "__main__":
    # Create sample data with many records
    sample_data = {
        "activities": [
            {"user": "alice", "type": "login", "message": "bla bla bla"},
            {"user": "yossi", "type": "login", "message": "bla bla bla"},
            {"user": "alice", "type": "login", "message": "bla bla bla"},
            {"user": "tal", "type": "login", "message": "bla bla bla"},
            {"user": "tossi", "type": "login", "message": "bla bla bla"},
            {"user": "alice", "type": "login", "message": "bla bla bla"},
            {"user": "gal", "type": "login", "message": "bla bla bla"},
            {"user": "alice", "type": "login", "message": "bla bla bla"},
            {"user": "yossi", "type": "login", "message": "bla bla bla"},
            {"user": "alice", "type": "login", "message": "bla bla bla"},
            {"user": "tal", "type": "login", "message": "bla bla bla"},
            {"user": "alice", "type": "login", "message": "bla bla bla"},
            {"user": "gal", "type": "login", "message": "bla bla bla"},
            {"user": "tossi", "type": "login", "message": "bla bla bla"},
            {"user": "alice", "type": "login", "message": "bla bla bla"},
        ]
    }
    
    # Save sample data to a JSON file
    with open('sample_user_data.json', 'w') as f:
        json.dump(sample_data, f, indent=2)
    
    # Analyze the data
    results = analyze_user_data('sample_user_data.json')
    
    # Print results
    print("\nAnalysis Results:")
    print("-" * 50)
    print(f"Most active user: {results['most_active_user']['name']}")
    print(f"Number of actions: {results['most_active_user']['action_count']}")
    print(f"Percentage of total activity: {results['most_active_user_percentage']}%")
    print(f"Total number of actions: {results['total_actions']}")
    print(f"Number of unique users: {results['unique_users']}")
    print(f"Average actions per user: {results['average_actions_per_user']}")
    print(f"Median actions per user: {results['median_actions_per_user']}")
    
    print("\nAll users ranked by activity:")
    print("-" * 50)
    for user, count in results['all_users_ranked']:
        print(f"{user}: {count} actions")

get_most_active_user(data: Dict) -> Dict: Returns a dictionary with the most active user's name and action count.

get_user_activity_percentage(data: Dict) -> float: Returns the percentage of total activity for the most active user.

get_total_actions(data: Dict) -> int: Returns the total number of actions in the data.

get_unique_users_count(data: Dict) -> int: Returns the number of unique users in the data.

get_all_users_ranked(data: Dict) -> List[Tuple[str, int]]: Returns a list of tuples, where each tuple contains the username and their activity count.

analyze_user_data(file_path: str) -> Dict: Returns a dictionary containing the analysis results.

get_average_actions_per_user(data: Dict) -> float: This function calculates the average number of actions per user by dividing the total number of actions by the number of unique users.

get_median_actions_per_user(data: Dict) -> int: This function calculates the median number of actions per user. It first gets a sorted list of the action counts for each user. Then, it determines the median by checking if the length of the list is even or odd, and selecting the appropriate middle value(s).

Upvotes: 0

change198
change198

Reputation: 2065

This might help you to begin with:

 a = ["{\"msg\":\"result\",\"id\":\"test\",\"result\":{\"categories\":[\"<20M\",\"20M+\",\"50M+\",\"300M+\",\"1G\"],\"series\":[{\"name\":\"Fiber\",\"data\":[216,41,10393,37394,6016]}],\"totals\":{\"<20M\":216,\"20M+\":41,\"50M+\":10393,\"300M+\":37394,\"1G\":6016}}}"]

string_input = ''.join(str(s) for s in a)
print(string_input)

    category = json.loads(string_input)['result']['categories']
    series = json.loads(string_input)['result']['series']
    total = json.loads(string_input)['result']['totals']
    print(category, series, total)

Also be careful, your input string is not properly formatted. it should be " not

Upvotes: 1

Related Questions