Home > Net >  Decoding json message inside of string
Decoding json message inside of string

Time:01-03

I have the following decoding function;

def flatten_data(json_data):
    """
    Arguments:
        json_data (dict): json data
    Returns:
        dict : {a:1, b:2, b_c:1, b_d:2}
    """
    out = {}

    def flatten(x, name=''):
        if type(x) is dict:
            for a in x:
                flatten(x[a], name   a   '_')
        elif type(x) is list:
            out[name[:-1]] = x
        else:
            out[name[:-1]] = x

    flatten(json_data)
    return out

If I am giving the following JSON body input to this function;

{
  "id": "123",  
  "name": "Jack",  
  "createdAt": 20221212,  
  "region": '{"country": "USA", "city": "NewYork"}'
}

I need to get the output as follows;

{
  "id": "123",  
  "name": "Jack",  
  "createdAt": 20221212,  
  "region_country": "USA",
  "region_city": 'NewYork'
}

How can I modify my flatten_data function?

CodePudding user response:

Because your "region" key in json_data provides str data instead of dict that is why you are getting the wrong JSON value. please try to make it dict.

try this data

 json_data = {
  "id": "123",  
  "name": "Jack",  
  "createdAt": 20221212,  
  "region": {"country": "USA", "city": "NewYork"}
 }

CodePudding user response:

You can do it this way with some modification to your existing code where the value is str because in this case, the region \has quotation "". So to handle this you can use built-in json module.

import json

def flatten_data(json_data):
    """
    Arguments:
        json_data (dict): json data
    Returns:
        dict : {a:1, b:2, b_c:1, b_d:2}
    """
    out = {}

    def flatten(x, name=''):
        if type(x) is dict:
            for a in x:
                flatten(x[a], name   a   '_')
        elif type(x) is list:
            out[name[:-1]] = x
        elif type(x) is str:
            try:
                y = json.loads(x)
                flatten(y, name)
            except:
                out[name[:-1]] = x
        else:
            out[name[:-1]] = x

    flatten(json_data)
    return out

json_data = {
  "id": "123",  
  "name": "Jack",  
  "createdAt": 20221212,  
  "region": '{"country": "USA", "city": "NewYork"}'
}

print(flatten_data(json_data))

Output:

{
  "id": "123",  
  "name": "Jack",  
  "createdAt": 20221212,  
  "region_country": "USA",
  "region_city": 'NewYork'
}
  • Related